排序算法——快速排序
快速排序的原理:在待排序的数字序列{0, 1, ... , n-1, n}中随机选择一个数字作为基准数(一般选择序列中的第一个数字),接着从最后一个元素开始,向前找小于基准数的元素,找到的话,把元素x的值赋到基准数的位置;接着从基准数的下一个位置开始向后查找大于基准数的元素,找到的话,把该元素的值赋到元素x的位置。直到向前和向后遍历的标尺位于同一个元素位置y,这个位置就是基准数应该被放置的位置,接着把基准数赋到y位置。接着,根据上一次基准数的位置y把序列分为两个子序列:{0, ..., y-1}和{y+1, ... , n};对这两个子序列分别使用上述算法继续排序,直至子序列长度为1。
下面是对应的算法实现:
1 #include <iostream> 2 using namespace std; 3 4 int quick_sort(int *arr, int begin, int end) 5 { 6 if (begin >= end) 7 return 0; 8 9 int temp = arr[begin]; 10 int head = begin; 11 int rear = end; 12 bool flag = false; 13 while(head < rear) 14 { 15 if (!flag) 16 { 17 if (arr[rear] < temp) 18 { 19 arr[head++] = arr[rear]; 20 flag = true; 21 } 22 else 23 { 24 rear--; 25 } 26 } 27 else 28 { 29 if (arr[head] > temp) 30 { 31 arr[rear--] = arr[head]; 32 flag = false; 33 } 34 else 35 { 36 head++; 37 } 38 } 39 } 40 arr[head] = temp; 41 quick_sort(arr, begin, head-1); 42 quick_sort(arr, head+1, end); 43 44 return 0; 45 } 46 47 int sort(int *arr, int length) 48 { 49 quick_sort(arr, 0, length-1); 50 return 0; 51 } 52 53 void print_logs(int *arr, int length) 54 { 55 for (int i = 0; i < length; ++i) 56 { 57 cout << arr[i]; 58 if (i != length-1) 59 { 60 cout << " , "; 61 } 62 } 63 cout << endl; 64 } 65 66 int main() 67 { 68 int a[] = {2, 4, 5, 1, 3, 6, 9, 8, 7, 10, 32, 43, 15, 90, 55, 65, 65, 76, 91}; 69 70 int length = sizeof(a) / sizeof(*a); 71 sort(a, length); 72 73 print_logs(a, length); 74 75 return 0; 76 }