快速排序
截止到这篇博客,已经将常见的排序算法都进行了实现, 下图是不同排序算法的效率分析。可以看到对于10以内的排序,采用插入排序最快,对于1000以内采用希尔排序更加合理,当然要合理选取增量。对于1000个数据量以上采用快排,效率最高。堆排序虽然时间复杂度也是O(NlogN),但是实际中堆排序比希尔排序要慢。关于归并排序,因为归并的过程比较麻烦,对于小数据的排序不常用,但是对于外部排序则采用的是归并思想。
1 /************************************************************************/ 2 /* 快排 3 /* 时间复杂度O(NlogN) 4 /************************************************************************/ 5 #include <stdio.h> 6 #include <cstdlib> 7 8 #define swap(a, b) {(a) = (a) ^ (b); (b) = (a)^ (b); (a) = (a) ^ (b);} 9 10 //插入排序 11 void InsertionSort(int* array, int size) 12 { 13 int i, j; 14 int tmp; 15 for (i = 1; i < size; ++i) 16 { 17 tmp = array[i]; 18 for (j = i; array[j - 1] > tmp && j > 0; --j) 19 { 20 array[ j ] = array[j - 1]; 21 } 22 array[ j ] = tmp; 23 } 24 } 25 26 //选取枢纽元,将最左、最右和中间三个中最小的那个作为枢纽元 27 int MinThree(int array[], int left, int right) 28 { 29 int center = (left + right) / 2; 30 31 //将三个数交换位置,使得array[left]<array[center]<array[right] 32 if (array[left] > array[center]) 33 { 34 swap(array[left], array[right]); 35 } 36 if (array[left] > array[right]) 37 { 38 swap(array[left], array[right]); 39 } 40 if (array[center] > array[right]) 41 { 42 swap(array[center], array[right]); 43 } 44 45 //将中间的枢纽元与right - 1上的元素交换,避免枢纽元参与排序过程 46 swap(array[center], array[right - 1]); 47 48 return array[right - 1]; 49 } 50 51 //快速排序核心程序 52 void QuickSort(int array[], int left, int right) 53 { 54 int pivot = MinThree(array, left, right); 55 56 //递归终止的条件,元素个数为10时进行截断 57 if (left - right > 10) 58 { 59 int i = left; 60 int j = right - 1; 61 while (true) 62 { 63 //快排核心思想,交换元素,从左和右分别寻找比枢纽元大的和比枢纽元小的元素 64 while (array[++i] > pivot){} 65 while (array[--j] < pivot){} 66 67 //交换这两个元素的位置 68 if (i < j) 69 { 70 swap(array[i], array[j]); 71 } 72 else 73 { 74 break; 75 } 76 } 77 78 //将枢纽元与i位置元素交换回来 79 swap(array[right - 1], array[i]); 80 81 //枢纽元就将数组分成了两部分,一部分比枢纽元大的元素,一部分是比枢纽元小的元素,分别进行快排 82 QuickSort(array, left, i - 1); 83 QuickSort(array, i + 1, right); 84 } 85 else 86 { 87 //元素个数较少时,采用插入排序更快 88 InsertionSort(array + left, right - left + 1); 89 } 90 } 91 92 int main() 93 { 94 int array[] = {10, 78, 89, 105, 953, 243, 19, 45, 86, 84, 853, 542, 11, 546, 365, 745, 185, 45, 341, 425, 854, 62, 42, 98, 742, 95 102, 666, 441, 743, 548, 220, 12, 60, 1, 562, 888, 1025, 5423, 14, 448, 458, 635, 45, 8, 753, 91, 754, 685, 444, 85, 364, 542, 96 54, 983}; 97 98 int size = sizeof(array) / sizeof(int); 99 100 QuickSort(array, 0, size - 1); 101 int i = 0; 102 while (i < size) 103 { 104 if(i % 8 == 0) 105 printf("\r\n"); 106 printf("%5d ", array[i++]); 107 } 108 system("pause"); 109 return 0; 110 }