这是以前老师上课讲述的一种方法,听完之后对于快排的过程就十分深刻了,所以想记载下来方便以后的回忆。
① 6 10 13 5 8 3 2 11 ②6 10 13 5 8 3 2 11 ③6 10 13 5 8 3 2 11
i j i → j i → j
④6 5 13 10 8 3 2 11 ⑤6 5 13 10 8 3 2 11 ⑥6 5 13 10 8 3 2 11
→ i j i → j i → j
⑦6 5 3 10 8 13 2 11 ⑧6 5 3 10 8 13 2 11 ⑨6 5 3 2 8 13 10 11
→ i j i → j → i j
⑩6 5 3 2 8 13 10 11 ⑪2 5 3 6 8 13 10 11
i → j i j
上述过程为快排中间一次过程的详解。
由上图可以看出,指定i、j两个指针的初始位置,并且将第一个数字即i指向的数字6作为中间的分隔数字,之后进行如下过程。
j所指的数字与i所指的数字进行比较,如果比6大,则不用管,j向后移动;如果比6小,则将j位置的数字与i+1位置的数字进行交换,之后将i向后移 动一位。
移动到最后的时候,将首位数字即6与i位置的数字进行交换,这样便将整组数字分为前后两部分,前一部分小于6,后一部分大于或等于6,再将此 过程递归下去。
代码如下:
#include<iostream>
using namespace std;
int a[1000];
void Qsort(int l, int r) {
int i = l, j = l + 1;
for (; j <= r; j++) {
if (a[j] < a[l]) {
int temp = a[i + 1];
a[i + 1] = a[j];
a[j] = temp;
i++;
}
}
int temp = a[l];
a[l] = a[i];
a[i] = temp;
if (l < i - 1) Qsort(l, i - 1);
if (i + 1 < r) Qsort(i + 1, r);
}
int main() {
int num;
while (cin >> num) {
for (int i = 0; i < num; i++) {
cin >> a[i];
}
Qsort(0, num - 1);
for (int i = 0; i < num; i++) {
cout << a[i] << ' ';
}
cout << endl;
}
}