常见排序算法

1.直接插入排序

  算法思想:在插入第N个元素的时候,前面N-1个元素已经是排好序的了,因此查找前面N-1个元素,讲第N个元素插入到合适的位置。

实例:扑克牌抓拍,当玩家手头上有N-1个牌时,将第N个牌插入到合适的位置中

代码:

 1 int array[len] = {.......};
2
3 void insert_sort(void)
4 {
5 int i = 0, j = 0;
6 int key = 0;
7
8 for (i = 1; i < len; i++) {
9 key = array[i];
10 for (j = i-1; j >= 0 && array[j] > key; j--) {
11 array[j + 1] = array[j];
12 }
13 array[j+1] = key;
14 }
15 }

算法时间复杂度:1+2+3+..+N,所以复杂度为O(N^2)

2.shell排序(希尔排序)

  算法思想:shell排序是对插入排序的一个改进,

3.冒泡法/沉底法

  算法思想:每次遍历完序列都将最大的或者最小放在最前面或者最后面,然后再在剩下的序列中重复上述操作。每一次遍历都有一个元素到达最终位置,当剩下的序列为1时,排序完成。

时间复杂度:1+2+3+...+N,O(N^2)

代码:

 1 void bubble_sort(void)
3 {
4   int i = 0, j = 0;
5 for (i = 0; i < len; i++) {
6 for (j = 0; j < i; j++) {
7 if (array[i] > array[j]) {
8 swap(&array[i], &array[j]);
9 }
10 }
11 }
12 }
13 void deposit_sort(void)
14 {
15   int i = 0, j = 0;
16   for (i = len - 1; i >= 0; i--) {
17     for (j = i - 1; j >= 0; j--) {
18         if (array[i] > array[j])
19           swap(&array[i], &array[j]);
20     }
21   }
22 }

4.快速排序

  快速排序算法是对冒泡法的一种改进,算法思想:选择一个数作为key,通过一趟排序将要排序的数据分割成两个独立的部分,其中一部分的数据都要比key要小,另一部分比key大,然后采用递归的办法对这两部分数据进行快速排序,直到所有的数据变成有序序列。

步骤:

(1)以数组array[len]的第一个元素作为key,定义两个迭代器,i,j,排序开始时,i = 1,j = N - 1;

(2)从j开始向前搜索,找到第一个小于key的元素,将array[j]和key交换,break;

(3)从i开始向后搜索,找到第一个大于key的元素,将array[i]和key交换,break;

(4)重复(2),(3)直到i = j,一轮排序结束。

经过一轮排序以后,将key移动到i的位置(这时候i = j),这样key前面的数都比它小/大,key后面的数比它都大/小。

之后分别对key前面和后面序列进行快速排序,从而完成所有排序,形成一个有序序列。

算法复杂度:O(nlog2n)

 1 void quick_sort(int left, int right)
2 {
3 int i, j;
4 int key;
5
6 if (left < right) {
7 i = left;
8 j = right;
9 key = array[i];
10 while (i < j) {
11 while (i < j && array[j] >= key) {
12 j--;
13 }
14 if (i < j)
15 //array[i++] = array[j];
16 swap(&array[i], &array[j]);
17 while (i < j && array[i] <= key) {
18 i++;
19 }
20 if (i < j)
21 //array[j--] = array[i];
22 swap(&array[i], &array[j]);
23 }
24 //array[i] = key;
25 print_array();
26 quick_sort(left, i - 1);
27 quick_sort(i + 1, right);
28 }
29 }

5.堆排序

6.归并排序

posted on 2011-08-31 22:19  lambda107  阅读(625)  评论(1编辑  收藏  举报

导航