1. 直接插入排序(稳定排序)
简单的说就是将序列分为有序序列和无序序列。每一趟排序都是将无序序列的第一个元素插入有序序列中。R[1… i-1] <- R[i…n] , 每次取R[i]插入到R[1… i-1]中。
步骤如下:
1> 在R[1 … i-1]中找到R[i]的插入位置k (0<k<i)
2> 将R[k … i-1]均后移一位,K位置上插入R[i]
改进版:
1> 在R[1 … i-1]中将R[i]从右向左一一比较,R[j] >R[i],则R[j]后移一位(j = i-1开始)
2> 如果R[j] <=R[i],则j+1 为R[i]的插入位置
1 #include<stdio.h> 2 void insert_sort(int a[],int len) 3 { 4 int i=0,j=0,temp=0; 5 for(i=1;i<len;i++) 6 { 7 temp =a[i]; 8 for(j=i-1;j>=0&&temp<a[j];j--) 9 { 10 a[j+1]=a[j]; 11 } 12 a[j+1]=temp; 13 } 14 } 15 16 void print_array(int a[],int len) 17 { 18 for(int i=0;i<len;i++) 19 { 20 printf("a[%d] = %d ",i ,a[i]); 21 } 22 printf(" "); 23 } 24 25 26 int main() 27 { 28 int a[]={1,2,7,8,10,4,54,82,23} ; 29 printf("before sort "); 30 print_array(a,sizeof(a)/sizeof(a[0])); 31 insert_sort(a,sizeof(a)/sizeof(a[0])); 32 printf("after sort "); 33 print_array(a,sizeof(a)/sizeof(a[0])); 34 return 0; 35 }
2. 冒泡排序(稳定排序)
冒泡排序也叫起泡排序,顾名思义,就是每一趟,从左到右,两两比较,大的(小的)后移,最后最轻的气泡到最后的位置R[i],为最大或最小值,然后下一趟,选出次大的到R[i-1],以此,到最后R[1],至此全部有序。(按照递增递减都可以)
1 #include<stdio.h> 2 3 /* ...a[n] ,从a[0]最小开始,*/ 4 void bubble_sort_S2B(int a[],int len) 5 { 6 int i,j,temp; 7 for(i=0;i<len-1;i++) 8 { 9 for(j=0;j<len-i-1;j++) 10 { 11 if(a[j+1]<a[j]) 12 { 13 temp=a[j]; 14 a[j]=a[j+1]; 15 a[j+1]=temp; 16 } 17 } 18 } 19 } 20 void bubble_sort_B2S(int a[],int len) 21 { 22 int i,j,temp; 23 for(i=0;i<len-1;i++) 24 { 25 for(j=0;j<len-i-1;j++) 26 { 27 if(a[j+1]>a[j]) 28 { 29 temp=a[j]; 30 a[j]=a[j+1]; 31 a[j+1]=temp; 32 } 33 } 34 } 35 } 36 37 38 void print_array(int a[],int len) 39 { 40 for(int i=0;i<len;i++) 41 { 42 printf("a[%d] = %d ",i ,a[i]); 43 } 44 printf(" "); 45 } 46 47 48 int main() 49 { 50 int a[]={1,2,7,8,10,4,54,82,23} ; 51 printf("before sort "); 52 print_array(a,sizeof(a)/sizeof(a[0])); 53 bubble_sort_B2S(a,sizeof(a)/sizeof(a[0])); 54 printf("after sort "); 55 print_array(a,sizeof(a)/sizeof(a[0])); 56 return 0; 57 }