Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2566370
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: C/C++

2012-07-12 16:11:23

  估计是自己太笨,老觉得用算法实现排序很难。当然简单的好懂,稍微复杂的就懵了。唉,只有“烂笔头”了看来。
 

点击(此处)折叠或打开

  1. /*
  2.  ============================================================================
  3.  Name : sort.c
  4.  Author : hl
  5.  Version :
  6.  Copyright : Your copyright notice
  7.  Description : sorting in C, Ansi-style
  8.  ============================================================================
  9.  */

  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include "sort.h"

  13. /*
  14.  * 打印整型数组
  15.  */
  16. void print_array(int a[], int len)
  17. {
  18.     int i;
  19.     for (i = 0; i < len; i++)
  20.         printf("%d ", a[i]);
  21.     putchar('\n');
  22. }

  23. /*
  24.  * 冒泡排序: 时间复杂度( n^2) 稳定----相同元素排序和位置不变
  25.  * 说明:
  26.  *     1.注意i < len - 1,而不是i < len(
  27.  *      如果你写成了i < len或许对,而且不会报数组访问越界(那是因为编译器不检查),但是是错的。
  28.  * );
  29.  * 2.关于冒泡排序的改进就是增加标志位;
  30.  * 3.数据量大的时候改用快速排序;
  31.  */
  32. void bubble(int a[], int len)
  33. {
  34.     int i, j;
  35.     int temp;

  36.     int flag;

  37.     for (i = 0; i < len - 1; i++)
  38.     {
  39.         print_array(a, len);
  40.         flag = 1;
  41.         for (j = 0; j < len - i - 1; j++)
  42.         {
  43.             if (a[j] > a[j + 1])
  44.             {
  45.                 temp = a[j];
  46.                 a[j] = a[j + 1];
  47.                 a[j + 1] = temp;

  48.                 flag = 0;
  49.             }
  50.         }
  51.         if (1 == flag) //表示经过一轮比较后没有进行交换,因此跳出
  52.             break;
  53.     }
  54. }

  55. /*
  56.  * 快速排序: 时间复杂度(最好情况下 O(nlgn),最坏情况下 n^2)
  57.  * 说明:
  58.  *     1.冒泡排序的改进, 原地排序;
  59.  */
  60. int partitions(int a[], int low, int high)
  61. {
  62.     int key = a[low];
  63.     while (low < high)
  64.     {
  65.         while (low < high && a[high] >= key)
  66.             high--;
  67.         a[low] = a[high];
  68.         while (low < high && a[low] <= key)
  69.             ++low;
  70.         a[high] = a[low]; //有时候 low == high(++low之后)
  71.     }
  72.     a[low] = key;
  73.     return low; //从上面可以看出,Key只是作为标准;最终目是把比它小的放在前面,比它大的放在后面,利用交换实现;
  74. }

  75. void qsort_e(int a[], int low, int high)
  76. {
  77.     int mid;
  78.     if (low < high)
  79.     {
  80.         mid = partitions(a, low, high);
  81.         qsort_e(a, low, mid - 1);
  82.         qsort_e(a, mid + 1, high);
  83.     }
  84. }

  85. /*
  86.  * 插入排序: 时间复杂度(最好情况下 n,最坏情况下 n^2)
  87.  * 说明:
  88.  *     1.插入排序最好情况an + b和最坏情况an^2 + bn + c 的推导过程;
  89.  *     2.当n足够大时,(an^2 + bn + c)夹在c1n^2 和 c2n^2 之间的证明推理;
  90.  */
  91. void insertion_sort(int a[], int len)
  92. {
  93.     int j = 0, i = 0;
  94.     int key = 0;
  95.     for (j = 1; j < len; j++)
  96.     {
  97.         print_array(a, len);

  98.         key = a[j];
  99.         i = j - 1;
  100.         while (i >=0 && a[i] > key)
  101.         {
  102.             a[i + 1] = a[i];
  103.             i--;
  104.         }
  105.         a[i + 1] = key;
  106.     }
  107.     print_array(a, len);
  108. }

  109. /*
  110.  * 归并排序: 时间复杂度(nlogn)
  111.  * 说明:
  112.  *     1.插入排序最好情况n时,比归并排序效率高;
  113.  * 2.采用分而治之的策略;(自己还是很难想透,感觉拿来用就是了。)
  114.  */
  115. void merge(int start, int mid, int end, int a[], int len)
  116. {
  117.     //分割左右两部分
  118.     int n1 = mid - start + 1;
  119.     int n2 = end - mid;
  120.     int left[n1], right[n2];

  121.     int i, j, k;
  122.     for (i = 0; i < n1; i++) /* left holds a[start..mid] */
  123.     {
  124.         left[i] = a[start + i];
  125.     }
  126.     for(j = 0; j < n2; j++) /* right holds a[mid+1..end] */
  127.     {
  128.         right[j] = a[mid + 1 + j];
  129.     }

  130.     i = j = 0;
  131.     k = start;
  132.     while (i < n1 && j < n2)
  133.     {
  134.         if (left[i] < right[j])
  135.             a[k++] = left[i++];
  136.         else
  137.             a[k++] = right[j++];
  138.     }
  139.     while (i < n1) /* left[] is not exhausted */
  140.         a[k++] = left[i++];
  141.     while (j < n2) /* right[] is not exhausted */
  142.         a[k++] = right[j++];
  143. }

  144. void merge_sort(int start, int end, int a[], int len)
  145. {
  146.     int mid;
  147.     if (start < end)
  148.     {
  149.         mid = (start + end) / 2;
  150.         print_array(a, len);
  151.         merge_sort(start, mid, a, len);
  152.         merge_sort(mid + 1, end, a, len);
  153.         merge(start, mid, end, a, len);
  154.         print_array(a, len);
  155.     }
  156. }

  157. int main(void) {
  158. #if 0
  159.     int a[LEN] = {10, 5, 2, 4, 7};
  160.     insertion_sort(a, LEN);
  161. #endif
  162. #if 0
  163.     int a1[8] = {5, 2, 4, 7, 1, 3, 2, 6};
  164.     merge_sort(0, 7, a1, 8);
  165. #endif
  166. #if 0
  167.     int a2[LEN] = {10, 5, 6, 3, 7};
  168.     bubble(a2, LEN);
  169. #endif
  170.     int a3[7] = {49, 38, 65, 97, 76, 13, 27};
  171.     print_array(a3, LEN + 2);
  172.     qsort_e(a3, 0, 6);
  173.     print_array(a3, LEN + 2);

  174.     return EXIT_SUCCESS;
  175. }

阅读(910) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~