排序算法——快速排序

快速排序的原理:在待排序的数字序列{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 }
原文地址:https://www.cnblogs.com/slz-coder150315/p/8597999.html