简单排序

来源:互联网 发布:淘宝聚划算怎么报名 编辑:程序博客网 时间:2024/06/08 04:05
简单排序算法的实现:冒泡排序、选择排序、插入排序

 

 

 

冒泡排序:两两比较相邻的数字,如果反序就交换,直到没有反序的为止。

 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 }
bubble_sort

但例如序列如果是{2,1,3,4,5,6,7,8,9};这只需要一趟冒泡就OK;所以改进的冒泡就来了:

 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 }
bubblesort

复杂度呢两个for循环 所以O(N^2)

简单选择排序:选择一个值作为基准,如果遇到比它小的就替换,直到遇到最小的位置

 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 }
select_sort

当然因为算法简单,所以效率不高,时间复杂度O(N^2),在性能上略优于冒泡

插入排序:通俗讲就跟打扑克牌一样,每次插入的时候将序排好

 

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];        }    }}
inset_sort

 

时间复杂度大概在O(n^2/4)== O(n^2)

自己写的main函数测试:

 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 }
test

因为里面用了自己实现的交换函数和打印函数

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]);    }}

好吧 总结一下算复习算巩固!!!

 

原创粉丝点击