C语言排序实例(选择、冒泡、插入、折半、快速)

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. ///选择法排序  
  4. //a:为数组首地址  
  5. //n:为数组元素个数  
  6. void select_sort(int *a, int n)  
  7. {  
  8.     int i, j, k, temp;  
  9.     for(i = 0; i < n-1; i++)  
  10.     {  
  11.         k = i;  
  12.         for(j = i+1; j < n; j++)  
  13.         {  
  14.             if(a[k] > a[j])  
  15.             {  
  16.                 k = j;  
  17.             }  
  18.         }  
  19.           
  20.         if(i != k)  
  21.         {  
  22.             temp = a[i];  
  23.             a[i] = a[k];  
  24.             a[k] = temp;  
  25.         }  
  26.     }  
  27. }  
  28.   
  29. ///冒泡法排序  
  30. void bubble_sort(int *a, int n)  
  31. {  
  32.     int i, j, temp;  
  33.     for(i = 0; i < n-1; i++)  
  34.     {  
  35.         for(j = 0; j < n-1-i; j++)  
  36.         {  
  37.             if(a[j] > a[j+1])  
  38.             {  
  39.                 temp = a[j];  
  40.                 a[j] = a[j+1];  
  41.                 a[j+1] = temp;  
  42.             }  
  43.         }  
  44.     }  
  45. }  
  46.   
  47. ///插入法排序  
  48. void insert_sort(int *a, int n)  
  49. {  
  50.     int i, j, temp;  
  51.     for(i = 1; i < n; i++)  
  52.     {  
  53.         temp = a[i];  
  54.         for(j = i-1; j >= 0 && a[j] > temp; j--)  
  55.         {  
  56.             a[j+1] = a[j];//将前面的值往后移  
  57.         }  
  58.         a[j+1] = temp; //插在a[j]的后面  
  59.     }  
  60. }  
  61.   
  62. ///折半排序(希尔排序)  
  63. void shell_sort(int *a, int n)  
  64. {  
  65.     int i, j, flag, temp;  
  66.     int gap = n;  
  67.   
  68.     while(gap > 1)  
  69.     {  
  70.         gap = gap/2; //增量缩小,每次减半(折半)  
  71.         do  
  72.         {  
  73.             flag = 0;  
  74.               
  75.             //n-gap是控制上限不让越界  
  76.             for(i = 0; i < n-gap; i++)  
  77.             {  
  78.                 j = i + gap; //相邻间隔的前后值进行比较  
  79.                 if(a[i] > a[j])  
  80.                 {  
  81.                     temp = a[i];  
  82.                     a[i] = a[j];  
  83.                     a[j] = temp;  
  84.                       
  85.                     flag = 1;  
  86.                 }  
  87.             }  
  88.               
  89.         }while(flag != 0);  
  90.     }  
  91. }  
  92.   
  93. ///快速排序  
  94. //查找位置  
  95. int find_pos(int *a, int low, int high)  
  96. {  
  97.     int val = a[low];  
  98.       
  99.     while(low < high)  
  100.     {  
  101.         while(low < high && a[high] >= val)  
  102.         {//大于移动,小于则赋值,降序则相反  
  103.             high--;  
  104.         }  
  105.         a[low] = a[high];  
  106.           
  107.         while(low < high && a[low] <= val)  
  108.         {//小于移动,大于则赋值,降序则相反  
  109.             low++;  
  110.         }  
  111.         a[high] = a[low];  
  112.     }//终止while循环之后low和high一定是相等的  
  113.       
  114.     //high可以改为low  
  115.     a[low] = val;  
  116.       
  117.     return low;  
  118. }  
  119.   
  120. //low:第一个元素下标  
  121. //high:最后一个元素下标  
  122. void quick_sort(int *a, int low, int high)  
  123. {  
  124.     if(low < high)  
  125.     {  
  126.         int pos = find_pos(a, low, high);  
  127.         quick_sort(a, low, pos-1);  
  128.         quick_sort(a, pos+1, high);  
  129.     }  
  130. }  
  131.   
  132. int main(int argc, char *argv[])  
  133. {  
  134.     int a[] = {2, 10, 8, 1, 9, 7, 5, 4, 0, 6, 3};  
  135.     int n = sizeof(a)/sizeof(a[0]); //数组元素个数  
  136.       
  137.     //select_sort(a, n); //选择法排序  
  138.     //bubble_sort(a, n); //冒泡法排序  
  139.     //insert_sort(a, n); //插入法排序  
  140.     //shell_sort(a, n); //折半排序(希尔排序)  
  141.     quick_sort(a, 0, n-1); //快速排序  
  142.       
  143.     int i = 0;  
  144.     for(i = 0; i < n; i++)  
  145.     {  
  146.         printf("%d ", a[i]);  
  147.     }  
  148.     printf("\n");  
  149.       
  150.     return 0;  
  151. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值