排序算法 (C实现)

来源:互联网 发布:淘宝和支付宝的关系 编辑:程序博客网 时间:2024/05/22 14:39
#include<stdio.h>void MergeSort(int[],int[],int,int);void Merge(int[],int[],int,int,int);void swap(int *,int *);int main(){void PArr(int a[]);void Init(int a[]);void HeapSort(int *,int);void ShellSort(int *,int,int);void InsertSort(int *,int,int);int a[11];int b[11];Init(a);PArr(a);//初始化数组int optional;printf("\n--0:归并排序;1:堆排序;2:希尔排序;\n3:Normal Insert Sort--\n"); scanf("%d",&optional);switch (optional){case 0:MergeSort(a,b,1,10);break;case 1:HeapSort(a,10);break;case 2:ShellSort(a,1,10);break; case 3:InsertSort(a,1,10);break; default:printf("\n--你啥也没选--\n"); }PArr(a);printf("\nMain Done\n");return 0;} //普通的插入排序void InsertSort(int *a,int low,int high){int i,j;int d=1;//间距,便于后续扩充成Shell排序使用 //假设第一个节点是有序的从第二个节点开始排序 for(i=low+d;i<=high;i++){if(a[i]<a[i-d]){//检查到此点的位置不对 循环后移 便于前插 a[0]=a[i];for(j=i-d;j>0&&a[0]<a[j];j--) a[j+d]=a[j];a[j+d]=a[0];}}printf("\n--InsertSort Done--\n");} //shell排序  (Diminishing Increment Sort) void ShellSort(int *a,int low,int high){printf("\nShellSort Start:\n");int d=1,i,j;//只到增量变为0 while(d>0){for(i=d+low;i<=high;i++){if(a[i]<a[i-d]){a[0]=a[i];for(j=i-d;j>0&&a[0]<a[j];j-=d)a[j+d]=a[j];a[j+d]=a[0];}}d=d/2; }printf("\n--ShellSort Done--\n");} // 调整节点位置 从非叶一直调整到叶节点 void HeapAdjust(int *a,int length,int i){int child;printf("\n调整的节点是:%d\n",i); //逐步调整被要求的子节点for(;i*2<=length;i=child){//寻找最小的直接子节点 child=2*i;if(child<length&&a[child]>a[child+1]) child++; if(a[i]>a[child])swap(&a[i],&a[child]); else break;}}void HeapSort(int *a,int length){if(length==0)return;int mid=length/2;for(int i=mid;i>0;i--){//从最后一个非叶子节点 逐渐调成一个初始的小顶堆HeapAdjust(a,length,i);}//这里假设已经调整完成,把第一个节点和最后一个节点交换,然后调整顶 for(int j=length;j>0;j--){//取出第一个调整好的值,然后 逐渐减少 尾节点的位置,//一个问题就是这到底是大顶堆还是小顶堆swap(&a[1],&a[j]);HeapAdjust(a,length,1); }  printf("\nHeapSort Done\n");}void Init(int a[]){for(int i=1;i<=10;i++)a[i]=11-i; printf("\nInit Done\n");}void PArr(int a[]){for(int i=1;i<=10;i++)printf("%d ",a[i]);printf("\nPrint:Done\n");}//将一个数组分成两部分 分别排序 void MergeSort(int a[],int b[],int low,int high){printf("\nMSort  Circle:::low:%d,high:%d\n",low,high);int mid=(low+high)/2;if(low==high)return;//1-10  5//1-4   2  5-10   7//对两边分别排序 MergeSort(a,b,low,mid);MergeSort(a,b,mid+1,high);//对 排序过后的两边 进行合并 Merge(a,b,low,mid,high);printf("\nMerge Done\n");}void Merge(int a[],int b[],int low,int mid,int high){// 两部分  low---mid-1   和 mid---highint i=low,j=mid+1,k=low;while(i<=mid&&j<=high){if(a[i]<=a[j])b[k++]=a[i++];elseb[k++]=a[j++];} while(i<=mid) b[k++]=a[i++];while(j<=high)b[k++]=a[j++]; for(k=low;k<=high;k++)a[k]=b[k];printf("合并端 low:%d,mid:%d,high:%d",low,mid,high); }void swap(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;}


原创粉丝点击