5种最简单基础的排序方法
2013-04-07 08:02
375 查看
冒泡法
选择法
插入法
快速法
shell法
//从a[0]开始,依次将其和后面的元素比较, //若a[0]>a[i],则交换它们,一直比较到a 。 //同理对a[1],a[2],...a[n-1]处理。 #include <stdio.h> int main() { int a[5]={5,4,3,2,1},i; printf("原本的数字为:"); for(i=0;i<5;i++) { printf("%d ",a[i]); } printf("\n"); void bubble (int a[],int n); bubble (a,5); printf("冒泡法排序后:"); for(i=0;i<5;i++) { printf("%d ",a[i]); } return 0; } //冒泡法 void bubble (int a[],int n) { int i,j,temp; for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } }
选择法
//循环过程与冒泡法一致,定义了记号k=i, //依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j, //检查k=i是否仍成立,不成立则交换a[k],a[i]。 #include <stdio.h> int main() { int a[5]={5,4,3,2,1},i; printf("原本的数字为:"); for(i=0;i<5;i++) { printf("%d ",a[i]); } printf("\n"); void choose (int a[],int n); choose (a,5); printf("选择法排序后:"); for(i=0;i<5;i++) { printf("%d ",a[i]); } return 0; } //选择法 void choose (int a[],int n) { int i,j,k,temp; for(i=0;i<n-1;i++) { k=i;//给记号赋值 for(j=i+1;j<n;j++) { if (a[k]>a[j]); { k=j;//使k总是指向最小元素 } if (i!=k)//当k!=i时才交换 { temp=a[i]; a[i]=a[k]; a[k]=temp; } } } }
插入法
//比较直观的排序方法。 //先把数组头两个元素排好, //再依次把后面的元素插入适当的位置。 #include <stdio.h> int main() { int a[5]={5,4,3,2,1},i; printf("原本的数字为:"); for(i=0;i<5;i++) { printf("%d ",a[i]); } printf("\n"); void insert (int a[],int n); insert (a,5); printf("插入法排序后:"); for(i=0;i<5;i++) { printf("%d ",a[i]); } return 0; } //插入法 void insert(int a[],int n) { int i,j,temp; for(i=1;i<n;i++) { temp=a[i];//temp为要插入的元素 j=i-1; while(j>=0&&temp<a[j])//从a[i-1]开始找比a[i]小的数,并把数组元素后移 { a[j+1]=a[j]; j--; } a[j+1]=temp;//插入 } }
快速法
//选一个数组元素(一般为a[(i+j)/2],中间元素)作为参照 //把比它小的元素放左边,比它大的元素放在右边。 //运用递归,将它的左右两个子数组排序。 #include <stdio.h> int main() { int a[5]={5,4,3,2,1},i; printf("原本的数字为:"); for(i=0;i<5;i++) { printf("%d ",a[i]); } printf("\n"); void quick (int a[],int i,int j); quick (a,0,4); printf("快速法排序后:"); for(i=0;i<5;i++) { printf("%d ",a[i]); } return 0; } //快速法 void quick(int a[],int i,int j) { int m,n,temp; int k; m=i;//i:要排数组起始元素的下标 n=j;//j:要排数组结束元素的下标 k=a[(1+j)/2];//选取的参照 do { while(a[m]<k&&m<j)//从左到右找比k大的元素 { m++; } while(a >k&&n>i)//从右到左找比k小的元素 { n--; } if (m<=n)//交换 { temp=a[m]; a[m]=a ; a =temp; m++; n--; } }while(m<=n); if(m<j) { quick(a,m,j);//递归调用 } if(n>i) { quick(a,i,n);//递归调用 } }
shell法
//先把相距k(k>=1)的那几个元素排好序, //再缩小k值(一般取其一半),再排序, //直到k=1时完成排序。 #include <stdio.h> int main() { int a[5]={5,4,3,2,1},i; printf("原本的数字为:"); for(i=0;i<5;i++) { printf("%d ",a[i]); } printf("\n"); void shell (int a[],int n); shell (a,5); printf("shell 法排序:"); for(i=0;i<5;i++) { printf("%d ",a[i]); } return 0; } //shell法 void shell(int a[],int n) { int i,j,k,x; k=n/2;//间距值 while(k>=1) { for(i=k;i<n;i++) { x=a[i]; j=i-k; while(j>=0&&x<a[j]) { a[j+k]=a[j]; j-=k; } a[j+k]=x; } k/=2;//缩小间距值 } }
相关文章推荐
- POJ 1002(不用排序的方法)(简单的字符串处理程序)
- 使用strace工具故障排查的5种简单方法
- python基础教程之简单入门说明(变量和控制语言使用方法)
- java基础整理の数组的排序方法
- 【基础算法】排序-简单排序之二(选择排序)
- salesforce零基础学习(七十九)简单排序浅谈 篇一
- iOS几种简单有效的数组排序方法
- 排序之简单排序方法
- XMLSchema基础 sequence 复杂元素中的简单元素为固定排序
- salesforce零基础学习(七十九)简单排序浅谈 篇一
- 【黑马程序员】3.C#基础之排序方法总结
- [Mac] R入门 三 基础数据分析的一些简单方法
- 例题:计算运费。c#语言基础,比较简单。看代码输入格式和方法。同样方法可以做一个 出租车打车的程序
- 最简单的List集合排序方法
- 【C#基础知识】之结构、数组及常用的几种排序方法总结
- php简单实现多维数组排序的方法
- iOS开发之基础类的简单初始化方法
- AJAX学习基础:简单介绍数据岛使用方法
- IOS几种简单有效的数组排序方法
- 【iOS】对象数组排序最简单的方法