(C语言)八大排序之:插入排序、冒泡排序、选择排序

  1 /* 
  2  * FILE: p198_sort.c
  3  * DATE: 20180114
  4  * --------------
  5  */
  6 
  7 #include <stdio.h>
  8 
  9 /* 从小到大 排序 */
 10 void insert_sort_min(int *array, int length);
 11 void bubble_sort(int *array, int length);
 12 void select_sort(int *array, int length);
 13 
 14 void print(const int *array, const int length);
 15 
 16 #define swap(a, b) do{ \
 17         (a) = (a) ^ (b); \
 18         (b) = (b) ^ (a); \
 19         (a) = (a) ^ (b); \
 20         }while(0)
 21 
 22 int main(int argc, char *argv[])
 23 {
 24         int a[] = {5,2,7,4,9,1,2,0};
 25         int len = sizeof(a) / sizeof(a[0]);
 26         print(a, len);
 27         insert_sort_min(a, len);
 28         print(a, len);
 29         bubble_sort(a, len);
 30         print(a, len);
 31         select_sort(a, len);
 32         print(a, len);
 33         return 0;
 34 }
 35 
 36 /* 直接插入排序 straight insertion sort */
 37 /* 若当前数 比前一个数更小,有元素都向后移一位
 38  * 再将当前数 插入至它应在的位置
 39  * 当前数的前面 已经排好序 */
 40 void insert_sort_min(int *array, int length)
 41 {
 42         int i;
 43         for(i=1; i<length; i++)
 44         {
 45                 int j = i;
 46                 int temp = array[i];
 47                 // 小心:是temp<array[j-1];而不是a[j]
 48                 // 若需从大到小 则temp>array[j-1]
 49                 while((j>0) && (temp < array[j-1]))
 50                 {
 51                         array[j] = array[j-1];
 52                         j--;
 53                 }
 54                 array[j] = temp;
 55         }
 56 }
 57 
 58 /* 冒泡排序 bubble sort */
 59 /* 相邻的两两比较 */
 60 void bubble_sort(int *array, int length)
 61 {
 62         int i, j;
 63         for(i=0; i<length-1; i++)
 64                 for(j=1; j<length-i; j++)
 65                 {
 66                         // 若需从大到小,则a[j]>a[j-1]
 67                         if(array[j] > array[j-1])
 68                                 swap(array[j], array[j-1]);
 69                 }
 70 }
 71 
 72 /* 简单选择排序 simple selection sort */
 73 /* 当前元素 与其后的所有元素比较 */
 74 void select_sort(int *array, int length)
 75 {
 76         int i, j;
 77         for(i=0; i<length-1; i++)
 78                 for(j=i+1; j<length; j++)
 79                 {
 80                         // 若需从大到小,则a[j]>a[i]
 81                         if(array[j] < array[i])
 82                                 swap(array[j], array[i]);
 83                 }
 84 }
 85 
 86 void print(const int *array, const int length)
 87 {
 88         int i;
 89         for(i=0; i<length; i++)
 90                 printf("%d ", array[i]);
 91         printf("\n");
 92 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值