十大排序(知识篇)--纯手工代码

95 阅读2分钟
//
//冒泡排序
//
#include <bits/stdc++.h>

using namespace  std;


void bubbleSort(int arr[],int len){

   bool flag = false;
   for(int i=0;i<len-1;i++){
       flag = false;
       for(int j=0;j<len-i-1;j++){
           if(arr[j] > arr[j+1]){
               swap(arr[j],arr[j+1]);
               flag = true;
           }
       }
       if(!flag){
           break;
       }
   }

}
//
// 计数排序
//
#include <bits/stdc++.h>


using namespace std;

void countingSort(int arr[],int len){

    int maxn = 0;
    for(int i=0;i<len;i++){maxn = max(maxn,arr[i]);}
    int t = maxn;

    int *cen = new int[maxn+10];
    for(int i=0;i<=maxn;i++){cen[i] = 0;}
    for(int i=0;i<len;i++){cen[arr[i]]++;}
    for(int i=1;i<=maxn;i++){cen[i] += cen[i-1];}

    int *ans = new int[len];
    for(int i=0;i<len;i++){
        ans[cen[arr[i]]-1] = arr[i];
        cen[arr[i]]--;
    }

    for(int i=0;i<len;i++){
        arr[i] = ans[i];
    }

    delete []ans;
    delete []cen;

}
//堆排序
#include <bits/stdc++.h>

using namespace std;

int heapSize = 0;

int left(int x){

    if(2*x+1 >= heapSize) return -1;
    return 2*x+1;
}

int right(int x){

    if(2*x+2 >= heapSize) return -1;
    return 2*x+2;

}

void minHeapify(int arr[],int x){

    int L = left(x);
    int R = right(x);

    int mann = x;
    if(L != -1 && arr[L] > arr[mann]){mann = L;}
    if(R != -1 && arr[R] > arr[mann]){mann = R;}

    if(mann != x){
        swap(arr[x],arr[mann]);
        x = mann;
        minHeapify(arr,x);
    }


}

void Delete(int arr[]){

    swap(arr[heapSize-1],arr[0]);
    heapSize--;
    minHeapify(arr,0);
}

void heapSort(int arr[],int len){

    //建立大顶堆
    heapSize = len;
    for(int i=(len-1)/2;i>=0;i--){
        minHeapify(arr,i);
    }

    //从堆中取结点
    for(int i=0;i<len;i++){
        Delete(arr);
    }

}
//
// 直接插入排序
//

#include <bits/stdc++.h>

using namespace std;

void insertSort(int arr[],int len){

    for(int i=1;i<len-1;i++){
        int j   =  i-1;
        int key =  arr[i];
        while(j>=0 && arr[j] > key){
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }

}

 

//
// 归并排序
//
#include <bits/stdc++.h>

using namespace std;

void merge(int arr[],int l,int r){

    int mid = (l+r)/2;
    int nL  =  mid-l+1;
    int nR  =  r-mid;

    //创建两个行的数组存放
    int *L = new int[nL];
    int *R = new int[nR];
    for(int i=0;i<nL;i++){L[i]=arr[l+i];}
    for(int i=0;i<nR;i++){R[i]=arr[i+mid+1];}

    int i=0,j=0;        //分别指向L和R
    for(int k=l;k<=r;k++){

        if(j>=nR || (i<nL && L[i]<=R[j])){
            arr[k] = L[i++];
        }else{
            arr[k] = R[j++];
        }
    }

}

void mergeSort(int arr[],int l,int r){

    if(l < r){
        int mid = (l+r)/2;
        mergeSort(arr,l,mid);
        mergeSort(arr,mid+1,r);
        merge(arr,l,r);
    }
}

 

//
// 鸽巢排序
//

#include <bits/stdc++.h>

using namespace std;

void pigeonSort(int arr[],int len){

    int k = 0;
    for(int i=0;i<len;i++){k = max(k,arr[i]);}

    int *cen = new int[k+10];
    for(int i=0;i<=k;i++){cen[i]=0;}
    for(int i=0;i<len;i++){cen[arr[i]]++;}

    int j=0;
    for(int i=0;i<=k;i++){
        while(cen[i]){
            arr[j++] = i;
            cen[i]--;
        }
    }
    delete []cen;
}

 

//
//两种随机快排
//
#include <bits/stdc++.h>

using namespace std;

int partition(int arr[],int l,int r){

    int rd = l+rand()%(r-l);
    swap(arr[l],arr[rd]);
    int key = arr[rd];

    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;
}

int partition2(int arr[],int l, int r){

    int 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(int arr[],int l,int r){

    if(l < r){
        int mid = partition2(arr,l,r);
        quicksort(arr,l,mid-1);
        quicksort(arr,mid+1,r);
    }

}
//
// 基数排序
//

#include <bits/stdc++.h>

using namespace std;

void redixSort(int arr[],int len){

    int maxn = 0;
    for(int i=0;i<len;i++){maxn = max(arr[i],maxn);}
    int t = maxn;
    int d = 0;
    while(t){t/=10;d++;}

    int mod = 10;

    for(int k=0;k<d;k++){
        queue<int> Bucket[10];

        for(int i=0;i<len;i++){
            Bucket[(arr[i]%mod) / (mod/10)].push(arr[i]);
        }

        int j=0;
        for(int i=0;i<10;i++){
            while(!Bucket[i].empty()){
                arr[j++] = Bucket[i].front();
                Bucket[i].pop();
            }
        }
        mod *= 10;
    }

}
//
// 选择排序
//

#include <bits/stdc++.h>
using namespace  std;

void selectSort(int arr[],int len){

    for(int i=0;i<len-1;i++){
        int minx = i;
        for(int j=i+1;j<len;j++){
            if(arr[j] < arr[minx]){minx = j;}
        }
        swap(arr[i],arr[minx]);
    }
}
//
// 希尔排序
//
#include <bits/stdc++.h>

using namespace std;

void shellSort(int arr[],int len){

    int gap =  len/2;
    while(gap >= 1){
       //做一个直接插入
       for(int i=gap;i<len;i++){
            int j = i - gap;
            int key = arr[i];
            while(j>=0 && arr[j] > key){
                arr[j+gap] = arr[j];
                j=j-gap;
            }
            arr[j+gap] = key;
       }
       gap = gap/2;
    }
}

 如果有看不懂的地方,欢迎私聊和留下评论。。。必定及时解释