堆排序( heap sort ) reference:http://mp.weixin.qq.com/s/mY_bVJPWhzZWL5ZdooA6tw
1 /* FILE: heapSort.c
2 * DATE: 20180116
3 * --------------
4 */
5
6 #include <stdio.h>
7
8 #define swap(a, b) do{ \
9 (a) = (a) ^ (b); \
10 (b) = (b) ^ (a); \
11 (a) = (a) ^ (b); \
12 }while(0)
13
14 void heapAdjust(int *array, int parent, int length);
15 void heapSort(int *array, int length);
16 void print(int *array, int length);
17
18 int main(int argc, char *argv[])
19 {
20 int a[] = {1,3,4,5,2,6,9,7,8,0};
21 int len = sizeof(a) / sizeof(a[0]);
22 printf("origin: ");
23 print(a, len);
24 heapSort(a, len);
25 printf("heapSort: ");
26 print(a, len);
27 return 0;
28 }
29
30 void heapAdjust(int *array, int parent, int length)
31 {
32 int temp = array[parent]; // 保存当前父节点
33 int child = 2 * parent + 1; // 先获得左孩子
34 while(child < length)
35 {
36 if(child+1<length && array[child]<array[child+1])
37 child++;
38 // 如果父节点的值已经大于孩子节点的值,则直接结束
39 if(temp >= array[child])
40 break;
41 // 孩子节点的值赋给父节点
42 array[parent] = array[child];
43 parent = child;
44 child = 2 * parent + 1;
45 }
46 array[parent] = temp;
47 }
48
49 void heapSort(int *array, int length)
50 {
51 int i;
52 // 循环建立初始堆
53 for(i=length/2; i>=0; i--)
54 {
55 heapAdjust(array, i, length);
56 printf("initialization: ");
57 print(array, length);
58 }
59 // n-1次循环完成排序
60 for(i=length-1; i>0; i--)
61 {
62 // 第一个和最后一个元素交换
63 swap(array[i], array[0]);
64 // 筛选[0]节点,得到i-1个节点的堆
65 heapAdjust(array, 0, i);
66 print(array, length);
67 }
68 }
69
70 void print(int *array, int length)
71 {
72 int i;
73 for(i=0; i<length; i++)
74 printf("%d ", array[i]);
75 printf("\n");
76 }
快速排序( quick sort )
1 #include <stdio.h>
2
3 #define swap(a, b) do{ \
4 (a) = (a) ^ (b); \
5 (b) = (b) ^ (a); \
6 (a) = (a) ^ (b); \
7 }while(0)
8
9 void quickSort(int *array, int begin, int end);
10 void print(int *array, int length);
11
12 int main(int argc, char *argv[])
13 {
14 int a[] = {2,6,9,1,0,25,6};
15 int len = sizeof(a) / sizeof(a[0]);
16 print(a, len);
17 quickSort(a, 0, len-1);
18 print(a, len);
19
20 return 0;
21 }
22
23 void quickSort(int *array, int begin, int end)
24 {
25 int left = begin;
26 int right = end;
27 int pivot = array[begin];
28 if(begin >= end)
29 return;
30 while(left < right)
31 {
32 while((left<right) && (array[right] >= pivot))
33 right--;
34 swap(array[right], array[left]);
35 while((left<right) && (array[left] < pivot))
36 left++;
37 swap(array[left], array[right]);
38 }
39 array[left] = pivot;
40 quickSort(array, begin, left-1); // 递归
41 quickSort(array, left+1, end);
42 }
43
44 void print(int *array, int length)
45 {
46 int i;
47 for(i=0; i<length; i++)
48 printf("%d ", array[i]);
49 printf("\n");
50 }