快速排序

快速排序

 1 #include<iostream>
 2 #include<algorithm>
 3 ​
 4 using namespace std;
 5 ​
 6 int arr[100];
 7 ​
 8 void qu_sort(int l, int r)//二分
 9 {
10     if (l >= r) return;//如果左边界大于等于右边界,则返回,即不可再分了
11     int i = l - 1, j = r + 1, mid = arr[l + r >> 1];//mid为二分的界限,l+r>>1等于(l+r)/2,此处也可取mid=r、mid=l等,一般取这三种
12     while (i < j)//如果i<j,则代表数组还没二分完,继续循环
13     {
14         do i++; while (arr[i] < mid);//从左边界开始寻找第一个大于mid的值
15         do j--; while (arr[j] > mid);//从右边界开始寻找第一个小于mid的值
16         if (i < j) swap(arr[i], arr[j]);//交换两个值,使数组满足左边都是小于mid的值,右边都是大于mid的值
17     }
18     qu_sort(l, j);//数组左边界再次二分
19     qu_sort(j + 1, r);//数组右边界再次二分
20 }
21 ​
22 int main()
23 {
24     int n;
25     scanf("%d", &n);
26     for (int i = 0; i < n; i++)
27         scanf("%d", &arr[i]);
28     qu_sort(0, n - 1);//左边界从0开始,右边界从n-1开始
29     for (int i = 0; i < n; i++)
30         printf("%d ", arr[i]);
31     return 0;
32 }

利用快速排序求解”第k个数

 

posted @ 2021-12-07 23:17  ora12321  阅读(22)  评论(0)    收藏  举报