C中排序(代码实例)
程序员文章站
2023-01-24 19:13:19
c中排序(代码实例)
/*********************冒泡排序********************/
#include
#include&l...
c中排序(代码实例)
/*********************冒泡排序********************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<math.h> #include<sys/types.h> void maopao(int *a,int n) { int i,j,temp; for(i=0;i<n;i++) { for(j=0;j<n-1-i;j++) { if(a[j]>a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } } void show(int *a,int n) { int i; for(i=0;i<n;i++) { printf("%-3d",a[i]); } printf("\n"); } int main (void) { int a[10] = {12,23,10,14,8,22,43,1,3,0}; maopao(a,10); show(a,10); return 0; } /***********************************选择排序***********************************/ void choise(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; } } } } void show(int *a,int n) { int i; for(i=0;i<n;i++) { printf("%-3d",a[i]); } printf("\n"); } int main (void) { int a[10] = {10,14,8,22,94,95,4,5,6,1}; choise(a,10); show(a,10); return 0; } /*******************************************插入排序********************************************/ /*include插入法 * 插 入法是一种比较直观的排序方法。 * 它首先把数组头两个元素排好序, * 再依次把后面的元素插入适当的位置。 * 把数组元素插完也就完成了排序。*/ void insert(int *a,int n) { int i,j,temp; for(i=1;i<n;i++) { temp = a[i];/*temp为要插入的元素*/ j = i - 1; /*从a[i-1]开始找比a[i]小的数,同时把数组元素向后移*/ while(j>=0 && temp<a[j]) { a[j+1] = a[j]; j--; } a[j+1] = temp;/*插入*/ } } void show(int *a,int n) { int i; for(i=0;i<n;i++) { printf("%-3d",a[i]); } printf("\n"); } int main (void) { int a[10] = {12,2,4,67,32,45,22,11,90,15}; insert(a,10); show(a,10); return 0; } /**************************************快速排序**************************************************/ * 快速排序 * 快速法定义了三个参数, * (数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j) * 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照, * 把比它小的元素放到它的左边,比它大的放在右边。 * 然后运用递归,在将它左,右两个子数组排序, * 最后完成整个数组的排序。 * */ void quick(int *a,int i,int j) { int m,n,temp; int k; m=i; n=j; k=a[(i+j)/2]; /*选取的参照*/ while(m<=n) { while(a[m]<k&&m<j) m++; /* 从左到右找比k大的元素*/ while(a[n]>k&&n>i) n--; /* 从右到左找比k小的元素*/ if(m<=n) { /*若找到且满足条件,则交换*/ temp=a[m]; a[m]=a[n]; a[n]=temp; m++; n--; } } if(m<j) quick(a,m,j); /*运用递归*/ if(n>i) quick(a,i,n); } int show(int *a,int n) { int i; for(i=0;i<n;i++) { printf("%-3d",a[i]); } printf("\n"); return 0; } int main (void) { int a[10] = {23,13,1,4,2,56,78,22,10,3}; quick(a,0,9); show(a,10); return 0; } /*********************************************shell排序***********************************************************/ /*shell法 shell法是一个叫 shell 的美国人与1969年发明的。 它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半) 再排序,直到k=1时完成排序。下面让我们来分析其代码 */ void shell(int *a,int n) { int i,j,k,temp; k = n/2; while(k>=1) { for(i=k;i<n;i++) { temp = a[i]; j=i-k; while(j>=0 && temp<a[j]) { a[j+k]=a[j]; j-=k; } a[j+k]=temp; } k/=2; /*缩小间距值*/ } } void show(int *a,int n) { int i; for(i=0;i<n;i++) { printf("%-3d",a[i]); } printf("\n"); } int main (void) { int a[10] = {12,19,95,94,10,14,8,22,1,4}; shell(a,10); show(a,10); return 0; }