八大排序算法c++

1.冒泡排序

大部分人的第一个排序,想想以前我上c的时候,觉得一个冒泡排序难的和鬼一样,现在。。。

思想:每一趟将最大的固定在最后面;

void bubble_sort(int a[],int n){
    int i,j;
    for(i=0;i<n-1;i++){//只有一个的时候不用比较所以<n-1
        for(j=0;j<n-i-1;j++){
            if(a[j]>a[j+1])swap(a[j],a[j+1]);//用的是c++里面的#include<algorithm.h>头文件的方法
        }
    }
}

2.选择排序

思想:当前的i位置,在从[i,n]之中找一个最小值的位置然后交换;

void select_sort(int a[],int n){
    int i,j,index;
    for(i=0;i<n-1;i++){
        index=i;
        for(j=i+1;j<n;j++)if(a[index]>a[j])index=j;
        swap(a[index],a[i]);
    }
}

3.插入排序

思想:i为当前带比较的值,将i插入到[i,n]中合适的位置;

void insert_sort(int a[],int n){
    int i,j,key;
    for(i=0;i<n;i++){
        key=a[i],j=i-1;
        while(j>=0&&a[j]>key)a[j+1]=a[j--];
        a[j+1]=key;
    }
}

4.归并排序

思想:左右两边有序,合并为一个有序;

知道将两个有序的数组合并为一个,就ok

void merge_sort(int a[],int s,int e){
    if(s>=e)return;
    int mid=(s+e)/2;
    merge_sort(a,s,mid);
    merge_sort(a,mid+1,e);
    
    int i,j,k,temp[N];//定义了一个临时结果数组
    i=s,j=mid+1,k=s;
    while(i<=mid&&j<=e){
        if(a[i]<a[j])temp[k++]=a[i++];
        else temp[k++]=a[j++];
    }
    if(i<=mid)while(i<=mid)temp[k++]=a[i++];
    if(j<=e)while(j<=e)temp[k++]=a[j++];
    for(i=s;i<=e;i++)a[i]=temp[i];
}

5.快速排序

思想:以第一个数值为关键值,先从后面找一个比关键值小的交换,再从前面找一个比关键值大的交换,直到i==j再两边快排;

void quick_sort(int a[],int s,int e){
    if(s>=e)return;
    int i,j,key,mid;
    key=a[s],i=s,j=e;
    while(i<j){
        while(i<j&&a[j]>key)j--;
        if(i<j)a[i++]=a[j];
        while(i<j&&a[i]<key)i++;
        if(i<j)a[j--]=a[i];
    }
    a[i]=key;
    quick_sort(a,s,i);
    quick_sort(a,i+1,e);    
}

6.堆排序

思想:1.构造一个大顶堆 2.将根节点和最后一个叶子节点交换 3.对堆进行调整为大顶堆

void heap_adjust(int a[],int s,int e){
    int i,key;
    key=a[s];
    for(i=2*s+1;i<=e;i=i*2+1){//遍历s根的,左右节点,找出最大的值和s交换
        if(i<e&&a[i]<a[i+1])i++;
        if(a[i]<key)break;
        a[s]=a[i];
        s=i;
    }
    a[s]=key;
}//堆的调整

void heap_sort(int a[],int n){
    int i;
    for(i=n/2-1;i>=0;i--)heap_adjust(a,i,n-1);//首先将a[]构成一个大顶堆;heap_adjust要求比较的子树都是大顶堆,所以从最后的根节点向前进行;
    for(i=n-1;i>0;i--){
        swap(a[0],a[i]);
        heap_adjust(a,0,i-1);
    }
}

7.希尔排序

思想:缩小增量排序,按着d对a[]进行插入排序,缩小d的值

void shell_insert(int a[],int n,int d){
    int i,j,key;
    for(i=0;i<n;i++){
        j=i-d;
        key=a[i];
        while(j>=0&&a[j]>key){
            a[j+d]=a[j];
            j-=d;
        }
        a[j+d]=key;
    }
}
void shell_sort(int a[],int n){ int d=n/2; while(d){ shell_insert(a,n,d); d/=2; } }

8.基数排序

1.找到最长的位数 2.求各位数的数次数放入bucket[],将数放入output[] 3.从前向后收集数组的值入a[]

void distrubution(int a[],int n,int bucket[],int k){
    int i;
    for(i=0;i<n;i++)bucket[(a[i]/k)%10]++;
    for(i=1;i<n;i++)bucket[i]+=bucket[i-1];
}

void collection(int a[],int n,int bucket[],int k){
    int i,t[N];
    for(i=n-1;i>=0;i--){
        t[bucket[(a[i]/k)%10]-1]=a[i];
        bucket[(a[i]/k)%10]--;
    }
    for(i=0;i<n;i++)a[i]=t[i];
}

void radix_sort(int a[],int n){
    int maxnum,i,j,num;
    int bucket[N];
    maxnum=0;
    for(i=0;i<n;i++){
        num=a[i],j=0;
        while(num)num/=10,j++;
        if(maxnum<j)maxnum=j;
    }
    for(i=0;i<maxnum;i++){
        memset(bucket,0,sizeof(bucket));
        distrubution(a,n,bucket,pow(10,i));
        collection(a,n,bucket,pow(10,i));
    }
}
posted @ 2020-10-31 15:33  金龙喩  阅读(269)  评论(1)    收藏  举报