(更新中)内部排序

来源:互联网 发布:淘宝网拉杆箱价格图片 编辑:程序博客网 时间:2024/06/16 20:26

插入排序

直接插入排序

将每一个待排记录插到前面已排序列的适当位置

#include <iostream>using namespace std;int main(){    int num[10],j;    for(int i=0;i<10;i++){//i<L.length        num[i]=0;    }    for(int i=1;i<7;i++){//第0个为哨兵位        cin>>num[i];    }    for(int i=2;i<=6;i++){i<=L.length        if(num[i]<num[i-1]){            num[0]=num[i];            num[i]=num[i-1];//中间空调整已排序列            for(j=i-2;num[0]<num[j];j--){                num[j+1]=num[j];//大的往后移            }            num[j+1]=num[0];//归位        }    }    for(int k=1;k<7;k++){        cout<<num[k]<<" ";    }    cout<<endl;    return 0;}

折半插入排序

对前面已经排好序的部分进行折半,选择合适的位置插入

using namespace std;int main(){    int num[10],low,high;    for(int i=1;i<7;i++){        cin>>num[i];    }    for(int i=2;i<=6;i++){        num[0]=num[i];        low=1;high=i-1;        while(low<=high){//进行折半查找            int m=(low+high)/2;            if(num[0]<num[m]){//插入点在低半区                high=m-1;            }            else{//插入点在高半区                low=m+1;            }        }        for(int j=i-1;j>=high+1;j--){//记录后移            num[j+1]=num[j];        }        num[high+1]=num[0];//插入    }    for(int k=1;k<7;k++){        cout<<num[k]<<" ";    }    cout<<endl;    return 0;}

2-路插入排序

当作一个环

#include <iostream>using namespace std;int main(){    int arr[10],temp[10],n,i,k;    cin>>n;    for(int i=0;i<n;i++){        cin>>arr[i];    }    int first=0,final=0;    temp[0]=arr[0];    for(i=1;i<n;i++){        if(arr[i]<temp[first]){// 待插入元素比最小的元素小              first=(first-1+n)%n;            temp[first]=arr[i];        }else if(arr[i]>temp[final]){// 待插入元素比最大元素大              final=(final+1+n)%n;            temp[final]=arr[i];        }else{// 插入元素比最小大,比最大小              k=(final+1+n)%n;            while(temp[((k-1)+n)%n]>arr[i]){                temp[(k+n)%n]=temp[(k-1+n)%n];                k=(k-1+n)%n;            }            temp[(k+n)%n]=arr[i];            final=(final+1+n)%n;        }    }    // 将排序记录复制到原来的顺序表里      for(k=0;k<n;k++){        arr[k]=temp[(first+k)%n];    }    for(k=0;k<n;k++){        cout<<arr[k]<<" ";    }    cout<<endl;    return 0;}

希尔排序

例题
如图,13和49比,……,04和76比,比完了进行下一轮。增量序列是5 3 1.
这里涉及“增量序列可以各有取法”,于是没有代码。

快速排序

#include <stdio.h>int a[101],n;//定义全局变量,这两个变量需要在子函数中使用void quicksort(int left,int right){    int i,j,t,temp;    if(left>right)return;temp=a[left]; //temp中存的就是基准数 i=left;j=right;while(i!=j){//顺序很重要,要先从右往左找 while(a[j]>=temp && i<j)j--; //再从左往右找        while(a[i]<=temp && i<j)            i++;//交换两个数在数组中的位置 if(i<j)//当哨兵i和哨兵j没有相遇时 {            t=a[i];            a[i]=a[j];            a[j]=t;} }//最终将基准数归位 a[left]=a[i];    a[i]=temp;quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程quicksort(i+1,right);//继续处理右边的,这里是一个递归的过程 }int main() {int i,j,t; //读入数据 scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&a[i]); quicksort(1,n); //快速排序调用//输出排序后的结果 for(i=1;i<=n;i++)        printf("%d ",a[i]);    getchar();getchar();return 0; }

选择排序

简单选择排序

通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,和第i个记录交换

//关键代码for(i=1;i<last;i++)    {        k=i;        for(j=i+1;j<=last;j++)            if(data[j]<data[k])                k=j;        if(i!=k) //第i个元素与第k个元素交换        {            swap(data[k],data[i]);        }    }

树形选择排序

堆排序

//来源《啊哈算法》#include <iostream>using namespace std;int h[101];//存放堆的数组int n;//堆的大小void swap(int x,int y){    int temp=h[x];    h[x]=h[y];    h[y]=temp;}//向下调整函数void siftdown(int i){//传入一个需要向下调整的结点编号i    int t,flag=0;//标记是否需要继续向下调整    while(i*2<=n && flag==0){//当i结点有儿子        //用t记录较小的结点编号        if(h[i]>h[i*2]) t=i*2;        else t=i;        if(i*2+1<=n){//如果还有右儿子            if(h[t]>h[i*2+1]) t=i*2+1;        }        if(t!=i){            swap(t,i);            i=t;//接下来继续向下调整        }        else            flag=1;//没有调整的必要    }}void create(){    int i;    for(i=n/2;i>=1;i--){        siftdown(i);    }}//删除最大的元素int deletemax(){    int t=h[1];    h[1]=h[n];    n--;    siftdown(1);    return t;}int main(int argc, char *argv[]){    int num;    cin>>num;    for(int i=1;i<=num;i++){        cin>>h[i];    }    n=num;    create();    for(int i=1;i<=num;i++){        cout<<deletemin()<<" ";    }    return 0;}

归并排序

HDU 3743

查看原题

#include <iostream>using namespace std;int temp[1000005];long long answer;void merge(int *A,int s,int mid,int e){cout<<s<<" "<<mid<<" "<<e<<endl;    int i,j,k=0;    for(i=s,j=mid+1;i<=mid&&j<=e;){        if(A[i]<A[j])            temp[k++]=A[i++];        else{        //当a[i]>a[j]时,说明a[j]比前面那段都要小,所以总逆序对数要加上mid-i+1.            answer+=mid-i+1;            temp[k++]=A[j++];        }    }    while(i<=mid) temp[k++]=A[i++];    while(j<=e) temp[k++]=A[j++];    for(i=0;i<k;i++)        A[s+i]=temp[i];}void mergesort(int *A,int s,int e){    if(s<e){        int mid=(s+e)/2;        mergesort(A,s,mid);        mergesort(A,mid+1,e);        merge(A,s,mid,e);    }}int main(int argc, char *argv[]){    int n,num[1000005];    while(cin>>n){        for(int i=0;i<n;i++){            cin>>num[i];        }        answer=0;        mergesort(num,0,n-1);        cout<<answer<<endl;    }    return 0;}

基数排序

多关键字的排序

链式基数排序

各种排序的比较讨论

0 0
原创粉丝点击