快速排序
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个数