简单排序算法的实现:冒泡排序、选择排序、插入排序
冒泡排序:两两比较相邻的数字,如果反序就交换,直到没有反序的为止。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 void bubble_sort(int *br,int len) 2 { 3 for(int i = 0;i<len-1;i++) 4 { 5 for (int j = len-1;j>=i;j--) 6 { 7 if(br[j] > br[j+1]) 8 { 9 swap(&br[j],&br[j+1]); 10 } 11 } 12 } 13 }
但例如序列如果是{2,1,3,4,5,6,7,8,9};这只需要一趟冒泡就OK;所以改进的冒泡就来了:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //冒泡排序优化 2 void bubblesort(int *ar,int len) 3 { 4 bool flag = false; 5 for (int i = 0;i<len-1;i++) 6 { 7 flag = false; 8 for (int j = 0;j<len-1-i;j++) 9 { 10 if (ar[j] > ar[j+1]) 11 { 12 flag = true; 13 swap(&ar[j],&ar[j+1]); 14 } 15 { 16 break; 17 } 18 } 19 } 20 }
复杂度呢两个for循环 所以O(N^2)
简单选择排序:选择一个值作为基准,如果遇到比它小的就替换,直到遇到最小的位置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 void select_sort(int *ar,int len) 2 { 3 int min = 0; 4 for (int i=0;i<len-1;i++) 5 { 6 min = i; 7 for (int j =i+1;j<len;j++) 8 { 9 if (ar[min] > ar[j]) 10 { 11 min =j ; 12 } 13 } 14 if (i != min) 15 { 16 swap(&ar[i],&ar[min]); 17 } 18 19 } 20 }
当然因为算法简单,所以效率不高,时间复杂度O(N^2),在性能上略优于冒泡
插入排序:通俗讲就跟打扑克牌一样,每次插入的时候将序排好
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void insert_sort(int *ar,int len) { int j; for (int i=1;i<len;i++) { if (ar[i]<ar[i-1]) { ar[0] = ar[i]; for (j = i-1;ar[j]>ar[0];j--) { ar[j+1] = ar[j]; } ar[j+1] = ar[0]; } } }
时间复杂度大概在O(n^2/4)== O(n^2)
自己写的main函数测试:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int main() 2 { 3 int arr[] = {9,1,5,8,3,7,4,6,2,0}; 4 int brr[] = {2,1,3,4,5,6,7,8,9}; 5 //bubble_sort(arr,sizeof(arr)/sizeof(arr[0])); 6 //bubblesort(brr,sizeof(brr)/sizeof(brr[0])); 7 int len = sizeof(arr)/sizeof(arr[0]); 8 //select_sort(arr,len); 9 insert_sort(arr,len); 10 show(arr,sizeof(arr)/sizeof(arr[0])); 11 }
因为里面用了自己实现的交换函数和打印函数
void swap(int *a,int *b) { int tmp = *a; *a = *b; *b = tmp; } void show(int *cr,int len) { for (int i = 0;i < len;i++) { printf("%d\n",cr[i]); } }
好吧 总结一下算复习算巩固!!!