排序算法汇总

来源:互联网 发布:手机看漫画软件 编辑:程序博客网 时间:2024/05/19 17:23

1.选择排序

#include<iostream>using namespace std;int main(){    int min,temp;     int a[5]={4,2,7,4,19};     for(int i=0;i<5;i++){//找到最小的元素,将其放到a【i】中        min=i;        for(int j=i;j<5;j++){             if(a[j]<a[min])                min=j;        }           temp=a[min];           a[min]=a[i];           a[i]=temp;     }for(int i=0;i<5;i++)    cout<<a[i]<<"  ";}

2.冒泡排序

#include<iostream>using namespace std;int main(){   int a[10]={2,4,100,24,12,29,7,23,45,67};   int temp=0;   for(int i=0;i<10;i++){    for(int j=0;j<=i;j++){        if(a[i]<a[j]){            temp=a[j];            a[j]=a[i];            a[i]=temp;        }    }   }for(int i=0;i<10;i++){    cout<<a[i]<<"  ";}}

3.插入排序

#include<iostream>using namespace std;int main(){   int a[10]={2,4,100,24,12,29,7,23,45,67};   for(int i=1;i<10;i++){    int j=i-1;    int x=a[i];    while(j>=0&&a[j]>x){//依次扫描序号从i-1到1的元素        a[j+1]=a[j];        j--;    }        a[j+1]=x;   }    for(int i=0;i<10;i++){    cout<<a[i]<<"  ";}}

4.堆排序

#include <iostream>using namespace std;void siftdown(int a[],int i,int len){   int temp=a[i];//a[i]是要下移的元素   int largest;   for(largest=2*i+1;largest<len;largest=largest*2+1){//默认最大的为左子节点,同时要迭代完整棵子树       if(a[largest]<a[largest+1]&&largest+1<len){//右子节点是最大的情况          largest++;    }       if(a[largest]>temp){//将两个子节点中最大的换给父节点          a[i]=a[largest];          i=largest;//必须记录最大值的下标,因为下面还可能继续迭代        } }   a[i]=temp;}void makeheap(int a[],int len){//建堆是倒着来的,从最后一个节点开始siftdown,    //由于叶节点可以直接跳过,因此从最后一个非叶节点开始,也就是i=len/2-1   for(int i=len/2-1;i>=0;i--)      siftdown(a,i,len);}int main(){    int a[10]={2,45,20,3,9,6,5,109,200,10};    makeheap(a,10);    for(int j=9;j>=1;j--){        int temp=a[0];        a[0]=a[j];        a[j]=temp;        siftdown(a,0,j);//建完堆之后,堆顶a[0]为最大值,把它和最后一个元素a[j]交换,        //这样的话,就需要对a[0]进行siftdown,同时由于最后一个元素已经到了争取的位置,因此不再牵涉它    }  for(int i=0;i<10;i++){      cout<<a[i]<<" ";  }}

5.基数排序

#include<iostream>#include<vector>using namespace std;int getmax(int a[],int size){//获取最大有多少位     int maxnum=a[0];     int max=-1;//个位称为“0位”     for(int i=0;i<size;i++){//先求最大的数进而求得最大位数        if(a[i]>maxnum)            maxnum=a[i];     }     while(maxnum){        maxnum=maxnum/10;        max++;     }     return max;}void radixsort(int a[],int size,int max){     vector<int> vec[10];//这是一个数组,数组元素的类型是int向量     int counts[10];//counts[i]的值表示这个位置为i的数的个数,比如个位为2的数字的个数     int radix=1;     for(int i=0;i<max;i++){//每一位都要做一次        for(int p=0;p<10;p++)            counts[p]=0;        for(int p=0;p<10;p++)            vec[p].clear();//每次遍历要清空        for(int j=0;j<size;j++){//例如个位为2的数则添加到vec[2]中            int k=a[j]/radix%10;//获得该位的数字            vec[k].push_back(a[j]);            counts[k]++;        }         int k=0;        for(int i=0;i<10;i++){            for(int j=0;j<counts[i];j++){                a[k]=vec[i][j];                k++;            }        }     radix=radix*10;     }}int main(){    int a[5]={123,45,3476,91,32};    int max=getmax(a,5);    radixsort(a,5,max);    for(int i=0;i<5;i++){        cout<<a[i]<<" ";    }}
原创粉丝点击