#1冒泡排序(Insertion Sort)
插入排序的思路就像排序扑克牌一样,玩家每次抽到一张牌,依次用手中已有的牌与新抽到的牌进行比较,再按一定将新牌按顺序插入已排序的牌中。
C语言实现:
//Insertion_sort Algorithm /* eg. a[]={5,2,4,6,1,3} a[0] a[1] a[2] a[3] a[4] a[5] ① 5 2 4 6 1 3 ② 2 5 4 6 1 3 ③ 2 4 5 6 1 3 ④ 2 4 5 6 1 3 ⑤ 1 2 4 5 6 3 ⑥ 1 2 3 4 5 6 从a[1]起设为插入项key,与其之前的每一项进行比较,按大小顺序插入 key向后顺延一位到a[2],以此类推,直到最后一项比较插入完成 */ #include<stdio.h> void insertion_sort_up(int *a,int m); int main() { int a[40]; int k=0; do{ scanf("%d",a+k); k++; }while(getchar()!=‘\n‘); int i; insertion_sort_up(a,k); for(i=0;i<k;i++) printf("%d ",a[i]); return 0; } void insertion_sort_up(int *a,int m) { int i,j; int key; for(j=1;j<m;j++) { i=j-1; key=a[j]; while(i>=0&&a[i]>key) { a[i+1]=a[i]; i=i-1; } a[i+1]=key; } }
#2选择排序(Selection Sort)
从所给的n个数中找出最小数与数组中第一个数交换,然后在除去第一个数的余下n-1个数中第2小的数与数组中第二个数交换,以此类推完成前n-1个数交换。(此为升序排列)
伪代码:
Selection_sort(A)1 for j = 1 to A.length 2 for i = j to A.length 3 if A[ i ] < A[ j ] 4 k = A[ i ] 5 n = i 6 t = A[ j ] 7 a[ j ] = k 8 a[ i ] = t
C语言实现:
#include<stdio.h> void selection_sort(int *a,int n); int main() { int a[40]; int i=0,j; do{ scanf("%d",a+i); i=i+1; }while(getchar()!=‘\n‘); printf("original:"); for(j=0;j<i;j++) printf(" %d",a[j]); printf("\n"); selection_sort(a,i+1); printf("final :"); for(j=0;j<i;j++) printf(" %d",a[j]); return 0; } void selection_sort(int *a,int n) { int i,j,k,t,m,p; for(j=0;j<n-1;j++) { k=a[j]; for(i=j;i<n;i++) { if(a[i]<=k) //先前此处少了‘=‘,数次不过= - = { k=a[i]; m=i; } } t=a[j]; a[j]=k; a[m]=t; printf("time %d :",j+1); for(p=0;p<n-1;p++) { printf(" %d",a[p]); } printf("\n"); } }
... ...
#n快速排序
#include<stdio.h> int main() { printf("从小到大排列:\n"); int i,j,x,m,p,q; int a[]={4,3,5,1,2}; i=0; j=4; x=a[i]; printf("原顺序:"); for(q=0;q<5;q++) printf("%d ",a[q]); printf("\n"); while(i<j) { if(a[j]<x) { m=a[j]; //标记a[j],因为之后向右挪位会覆盖最后一位 for(p=j;p>0;p--) a[p]=a[p-1]; //除第一位其余全部向右挪一位 a[0]=m; //将最后一位换到第一位,即整个数列进行了一次循环右移 x=a[++i]; //对比项不变,但位置向右移了一位,所以++i } else { j--; //若所在比较项≥对比项,则比较项变动,向左移一位 } if(i==j&&j!=0) { i=0; j--; x=a[0]; } //如果左右边界i,j相等,则改变对比项,进行下一轮对比; //如果相等且j=0,说明比较完毕,排序完成. } printf("现顺序:"); for(q=0;q<5;q++) printf("%d ",a[q]); printf("\n"); return 0; }
时间: 2024-10-31 12:24:49