首页 > 代码库 > 快速排序
快速排序
1 /************************************************************************/ 2 /* 快排 3 /* 时间复杂度O(NlogN) 4 /************************************************************************/ 5 #include <stdio.h> 6 7 #define swap(a, b) {(a) = (a) ^ (b); (b) = (a)^ (b); (a) = (a) ^ (b);} 8 9 //插入排序 10 void InsertionSort2(int* array, int size) 11 { 12 int i, j; 13 int tmp; 14 for (i = 1; i < size; ++i) 15 { 16 tmp = array[i]; 17 for (j = i; array[j - 1] > tmp && j > 0; --j) 18 { 19 array[ j ] = array[j - 1]; 20 } 21 array[ j ] = tmp; 22 } 23 } 24 25 //选取枢纽元,将最左、最右和中间三个中最小的那个作为枢纽元 26 int MinThree(int *array, int left, int right) 27 { 28 int center = (left + right) / 2; 29 30 //将三个数交换位置,使得array[left]<array[center]<array[right] 31 if (array[left] > array[center]) 32 { 33 swap(array[left], array[right]); 34 } 35 if (array[left] > array[right]) 36 { 37 swap(array[left], array[right]); 38 } 39 if (array[center] > array[right]) 40 { 41 swap(array[center], array[right]); 42 } 43 44 //将中间的枢纽元与right - 1上的元素交换,避免枢纽元参与排序过程 45 swap(array[center], array[right - 1]); 46 47 return array[right - 1]; 48 } 49 50 void QuickSort(int array[], int left, int right) 51 { 52 53 int pivot = MinThree(array, left, right); 54 55 //递归终止的条件 56 if (left - right <= 3) 57 { 58 int i = left; 59 int j = right - 1; 60 while (true) 61 { 62 //快排核心思想,交换元素 63 while (array[++i] > pivot){} 64 while (array[--j] < pivot){} 65 if (i < j) 66 { 67 swap(array[i], array[j]); 68 } 69 else 70 { 71 break; 72 } 73 } 74 //将枢纽元与i位置元素交换回来 75 swap(array[right - 1], array[i]); 76 77 //递归进行 78 QuickSort(array, left, i - 1); 79 QuickSort(array, i + 1, right); 80 } 81 else 82 { 83 //元素个数较少时,采用插入排序更快 84 InsertionSort2(array + left, right - left + 1); 85 } 86 } 87 88 int main() 89 { 90 int array[10] = {10, 45, 78, 32, 89, 18, 105, 953, 243, 19}; 91 QuickSort(array, 10); 92 int i = 0; 93 int j = sizeof(array) / sizeof(int); 94 while (i < j) 95 { 96 printf("%d ", array[i++]); 97 } 98 return 0; 99 }
快速排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。