十大排序引出的问题()

简介: 十大排序引出的问题()

//
// Created by RedmiBook on 2022/5/11.
//
#include <bits/stdc++.h>
using namespace std;
int partition(vector<int>&arr,int l,int r){
    int rd = l+rand()%(r-l);
    swap(arr[rd],arr[r]);
    int key = arr[r];
    int i=l;
    for(int j=l;j<r;j++){
        if(arr[j] < key){
            swap(arr[i],arr[j]);
            i++;
        }
    }
    swap(arr[i],arr[r]);
    return i;
}
void quicksort(vector<int>& arr,int l,int r){
    if(l < r){
        int mid = partition(arr,l,r);
        quicksort(arr,l,mid);
        quicksort(arr,mid+1,r);
    }
}
vector<int> MySort(vector<int>& arr) {
    // write code here
    if(arr.size() == 0){
        return arr;
    }
    int len = arr.size();
    quicksort(arr,0,len-1);
    return arr;
}
int main(){
    srand(time(0));
    vector<int> src;
    int tmp = 0;
    for(int i=0;i<100;i++){
        tmp = rand()%1000+1;
        src.push_back(tmp);
    }
    quicksort(src,0,99);
    for(int i=0;i<100;i++){
        cout<<src[i]<<"\t";
    }
    return 0;
}

//
// Created by RedmiBook on 2022/5/11.
//
#include <bits/stdc++.h>
using namespace std;
void merge(int A[], int m, int B[], int n) {
    int i=0,j=0;   //i指向A j指向B
    int *tmp = new int[m+n+1];
    int k=0;
    while(i<m  || j<n){
        if(j>=n || ( i<m&&A[i]<B[j])){
            tmp[k++] = A[i++];
        }else{
            tmp[k++] = B[j++];
        }
    }
    for(int i=0;i<k;i++){
        A[i] = tmp[i];
    }
    delete []tmp;
}
int main(){
    int  A[6] = {0};
    int  B[3] = {0};
    A[0] = 4;
    A[1] = 5;
    A[2] = 6;
    B[0] = 1;
    B[1] = 2;
    B[2] = 3;
    merge(A,3,B,3);
    for(int i=0;i<6;i++){
        cout<<A[i]<<"\t";
    }
    return 0;
}

 

//
// Created by RedmiBook on 2022/5/11.
//
#include <bits/stdc++.h>
using namespace std;
int partition1(vector<int>&arr,int l,int r){
    int rd = r;
    if(r > l){
        rd = l+rand()%(r-l);
    }
    swap(arr[rd],arr[r]);
    int key = arr[r];
    int i=l;
    for(int j=l;j<r;j++){
        if(arr[j] >= key){
            swap(arr[j],arr[i]);
            i++;
        }
    }
    swap(arr[i],arr[r]);
    return i;
}
int partition2(vector<int>&arr,int l,int r){
    int ld = l;
    if(r > l){
        ld = l+rand()%(r-l);
    }
    swap(arr[l],arr[ld]);
    int key = arr[l];
    while(l < r){
        while(l < r && arr[l] > key){
            l++;
        }
        arr[r] = arr[l];
        while(l < r && arr[r] <= key){
            r--;
        }
        arr[l] = arr[r];
    }
    arr[l] = key;
    return l;
}
void quickSort(vector<int>&arr,int l,int r,int k){
    int mid = partition2(arr,l,r);
    while(mid != k-1){
        if(mid < k-1){
            l=mid+1;
            mid = partition2(arr,l,r);
        }else{
            r = mid-1;
            mid = partition2(arr,l,r);
        }
    }
}
//通过堆来实现  ==>大顶堆
int heapSort(vector<int>&arr,int n,int k){
    priority_queue<int,vector<int>,greater<int>> heap;
    for(int i=0;i<n;i++){
        if(i < k){
            heap.push(arr[i]);
        }else{
            if(heap.top() < arr[i]){
                heap.pop();
                heap.push(arr[i]);
            }
        }
    }
    return heap.top();
}
int findKth(vector<int>&a, int n, int K) {
    // write code here
    if(K <= 0 || K>n) return -1;
    //quickSort(a,0,n-1,K);
    return heapSort(a,n,K);
    //return a[K-1];
}
int main(){
    srand(time(0));
    vector<int>src;
    src.push_back(1);
    src.push_back(2);
    src.push_back(3);
    src.push_back(4);
    src.push_back(5);
    //cout<<"aaa"<<endl;
    cout<<findKth(src,5,2)<<endl;
    return 0;
}

 

//
// Created by RedmiBook on 2022/5/10.
//
#include <bits/stdc++.h>
using namespace std;
//解法1  快排解法
int partition(vector<int>&arr,int l,int r){
    int rd = l+rand()%(r-l);
    swap(arr[rd],arr[l]);
    int key = arr[l];
    while(l < r){
        while(l < r && arr[r] >= key){
            r--;
        }
        arr[l] = arr[r];
        while(l < r && arr[l] < key){
            l++;
        }
        arr[r] = arr[l];
    }
    arr[l] = key;
    return l;
}
//解法2  快排解法
int partition2(vector<int>&arr,int l,int r){
    int rd = l+rand()%(r-l);
    swap(arr[rd],arr[r]);
    int key = arr[r];
    int i=l;
    for(int j=l;j<r;j++){
        if(arr[j] < key){
            swap(arr[j],arr[i]);
            i++;
        }
    }
    swap(arr[i],arr[r]);
    return i;
}
vector<int> GetLeastNumbers_Solution(vector<int>& input,int k){
    vector<int>ans;
    int len = input.size();
    if(k==0 || k>=len) {return ans;}
    int l=0,r=len-1;
    int mid = partition2(input,l,r);
    while(mid != k-1){
        if(mid < k-1){
            l = mid+1;
            mid = partition2(input,l,r);
        }else{
            r = mid-1;
            mid = partition2(input,l,r);
        }
    }
    for(int i=0;i<k;i++){
        ans.push_back(input[i]);
    }
    return ans;
}
//堆排序解法
vector<int>  GetLeastNumbers_heap(vector<int>& input,int k){
    vector<int> ans;
    int len = input.size();
    if(k<0 || k>=len){return ans;}
    priority_queue<int> heap;
    for(int i=0;i<len;i++){
        if(i < k){
            heap.push(input[i]);
        }else{
            if(input[i] < heap.top()){
                heap.pop();
                heap.push(input[i]);
            }
        }
    }
    for(int i=0;i<k;i++){
        ans.push_back(heap.top());
        heap.pop();
    }
    return ans;
}
int main(){
    srand(time(0));
    //解法1  快排解法
    vector<int> src;
    //4,5,1,6,2,7,3,8
    src.push_back(4);
    src.push_back(5);
    src.push_back(1);
    src.push_back(6);
    src.push_back(2);
    src.push_back(7);
    src.push_back(3);
    src.push_back(8);
    vector<int>ans = GetLeastNumbers_heap(src,4);
    for(int i=0;i<ans.size();i++){
        cout<<ans[i]<<" ";
    }
    return 0;
}
相关文章
|
机器学习/深度学习 算法 搜索推荐
重点算法排序之堆排序(下篇)
我们已经讲述了快速排序和归并排序,快速排序和归并排序详解文章链接:重点算法排序之快速排序、归并排序(上篇),我们本篇文章来详细讲述以下堆排序。堆排序的主要内容有:最大堆(大顶堆)、最小堆(小顶堆)、通过孩子找父亲、通过父亲找孩子、向下调整算法建堆。下面我会给大家一一介绍。
54 0
|
4月前
|
数据可视化 数据挖掘 Python
揭秘数据排序的神秘面纱:如何用DataFrame排序和排名洞悉数据背后的秘密?
【8月更文挑战第22天】DataFrame排序和排名是数据分析的关键步骤,尤其在使用Python的Pandas库处理表格数据时尤为重要。通过对DataFrame使用`sort_values()`方法可实现基于一列或多列的灵活排序,而`rank()`方法则能轻松完成数据排名。例如,对学生信息DataFrame按分数排序及排名,或先按年龄排序再按分数排名,均可快速洞察数据模式与异常值,适用于金融分析和教育研究等多个领域。掌握这些技术有助于提高数据分析效率并深入理解数据。
57 1
|
7月前
|
存储 算法 搜索推荐
一文带你秒懂十大排序(下)
一文带你秒懂十大排序
32 0
|
7月前
|
算法 搜索推荐 测试技术
一文带你秒懂十大排序(上)
一文带你秒懂十大排序
40 0
|
7月前
|
搜索推荐 算法 测试技术
数据结构:一篇拿捏十大排序(超详细版)
数据结构:一篇拿捏十大排序(超详细版)
60 0
|
7月前
|
算法 搜索推荐 程序员
【十大排序】带你深入分析快速排序
【十大排序】带你深入分析快速排序
|
机器学习/深度学习 存储 搜索推荐
数据结构与算法-八大排序
对于排序的了解一定要理解思想,能够很清楚它的时间复杂度和空间复杂度,稳定性等特性。 稳定的排序有:直接插入排序、冒泡排序、归并排序 不稳定的排序有:希尔排序、选择排序、堆排序、快速排序、计数排序
数据结构与算法-八大排序
|
机器学习/深度学习 存储 搜索推荐
七大排序经典排序算法
七大排序经典排序算法
82 0
七大排序经典排序算法
|
算法 搜索推荐
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
201 0
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
|
算法
算法排序问题。每种排序代表着没中思考问题的方式。我们学习了选择排序,冒泡排序,归并排序。让我们去回顾回顾吧。重在思想的领悟。
算法排序问题。每种排序代表着没中思考问题的方式。我们学习了选择排序,冒泡排序,归并排序。让我们去回顾回顾吧。重在思想的领悟。
88 0
算法排序问题。每种排序代表着没中思考问题的方式。我们学习了选择排序,冒泡排序,归并排序。让我们去回顾回顾吧。重在思想的领悟。