排序算法 (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;}
阅读全文
0 0
- 排序算法c实现
- 排序算法 (C实现)
- 排序算法实现(C/C++)
- 排序算法(C语言实现)
- 快速排序算法(c#)实现
- 经典排序算法-C实现
- 经典排序算法-C实现
- 经典排序算法-C实现
- 经典排序算法c实现
- 排序算法实现 C/C++
- Objective-C排序算法实现
- C语言排序算法实现
- Objective-C排序算法实现
- 八大排序算法C实现
- 排序算法--C语言实现
- 排序算法(C实现)------ 冒泡排序
- 排序算法(c实现)------- 插入排序
- 排序算法(C实现)------- 希尔排序
- Jmeter分布式测试
- junit测试报错:class not found
- 页面跳转的几种方法
- tar.gz本地文件上传到服务器无法解压.
- filter是如何工作的?
- 排序算法 (C实现)
- 浮动基础
- 高通(Qualcomm)LK源码深度分析(二)
- QT重启程序
- 一些不在教学里的道理
- "error while loading shared libraries: xxx.so.x" 错误的原因和解决办法
- 关于音乐播放器-不定时更新
- error C2065:未申明的标识符
- jstl标签的使用