八大排序算法总结

快排:这里的形参为最大索引(面试一定会问)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
#define maxn 10000
int arr[maxn]={3,5,7,4,1};
void quicksort(int a[],int l,int r){
    int i=l,j=r,tmp=a[l];
    if(l>=r) return;
    while(i!=j){
        while(j>i&&a[j]>tmp) j--;
        if(j>i) a[i]=a[j];
        while(i<j&&a[i]<tmp) i++;
        if(i<j) a[j]=a[i];
    }
    a[i]=tmp;
    quicksort(a,l,i-1);
    quicksort(a,i+1,r);
}
int main(){
    quicksort(arr,0,4);
    for(int i=0;i<5;i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
    return 0;
}

 归并:这里的形参为最大索引

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#define maxn 10000
using namespace std;
typedef long long ll;
int tmp[maxn],a[maxn];
void merge(int l,int m,int r){
    int i=l,j=m+1,k=0;
    while(i<=m&&j<=r){
        if(a[i]<a[j]) tmp[k++]=a[i++];
        else tmp[k++]=a[j++];
    }
    while(i<=m) tmp[k++]=a[i++];
    while(j<=r) tmp[k++]=a[j++];
    for(int i=l;i<=r;i++) a[i]=tmp[i-l];
}
void mergesort(int l,int r){
    if(l<r){
        int mid=(l+r)>>1;
        mergesort(l,mid);
        mergesort(mid+1,r);
        merge(l,mid,r);
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    mergesort(0,n-1);
    for(int i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

 堆排:这里的形参为size

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
void adjustheap(int heap[],int i,int size){
    int j=2*i+1;
    while(j<size){
        if(j<size-1&&heap[j]<heap[j+1]) swap(heap[j],heap[j+1]);
        if(heap[i]>heap[j])break;
        swap(heap[i],heap[j]);
        i=j;
        j=2*i+1;
    }
}
void heapsort(int heap[],int size){
    for(int i=size/2-1;i>=0;i--){
        adjustheap(heap,i,size);
    }
    for(int i=size-1;i>0;i--){
        swap(heap[0],heap[i]);
        adjustheap(heap,0,i);
    }
}
int main(){
    int a[10]={1,5,3,4,2};
    heapsort(a,5);
    for(int i=0;i<5;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

 插入、选择、冒泡:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#define maxn 10000
using namespace std;
typedef long long ll;
int arr[maxn]={1,3,2,5,4},n=5;
//插入、选择、冒泡、  堆排、快排、归并、希尔
void bubble_sort(){
    for(int i=0;i<n-1;i++){
        for(int j=0;j<n-1-i;j++){
            if(arr[j]>arr[j+1])swap(arr[j+1],arr[j]);
        }
    }
}
void select_sort(){
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(arr[j]<arr[i]) swap(arr[i],arr[j]);
        }
    }
}
void insert_sort(){
    for(int i=1;i<n;i++){
        for(int j=0;j<i;j++){
            if(arr[i]<arr[j]) swap(arr[i],arr[j]);
        }
    }
}
int main(){
    //bubble_sort();
    //select_sort();
    insert_sort();
    for(int i=0;i<n;i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
    return 0;
}

 希尔排序:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int arr[10] = {9,1,5,8,3,7,6,0,2,4};

void shellsort(int a[],int len){
    for(int gap=len/2;gap>0;gap/=2){
        for(int i=gap;i<len;i++){
            int j=i;
            while(j-gap>=0&&a[j]<a[j-gap]) swap(a[j],a[j-gap]),j-=gap;
        }
    }
}

int main(){
    shellsort(arr,10);
    for(int i=0;i<10;i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
    return 0;
}

 基数排序:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
int a[]={5,2,3,1,4};
void tmpsort(int a[],int n,int exp){
    int cnt[10]={0},output[n];
    for(int i=0;i<n;i++) cnt[a[i]/exp%10]++;
    for(int i=1;i<10;i++) cnt[i]+=cnt[i-1];
    for(int i=n-1;i>=0;i--) output[cnt[a[i]/exp%10]-1]=a[i],cnt[a[i]/exp%10]--;
    for(int i=0;i<n;i++) a[i]=output[i];
}
void radixsort(int a[],int n){
    int maxx=-inf;
    for(int i=0;i<n;i++) maxx=max(maxx,a[i]);
    for(int i=1;maxx/i>0;i*=10) tmpsort(a,n,i);
}
int main(){
    radixsort(a,5);
    for(int i=0;i<5;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

 

posted @ 2018-11-09 00:17  Elpsywk  阅读(163)  评论(0编辑  收藏  举报