快速排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
int partition(int arr[], int low, int high)
{
// 分割元素
int key = arr[low];

// 从右边开始找比key小的元素
while (low < high) {

// 从右边找到一个比key小的元素
if (arr[high] <= key) {
// 把左边存放key的位置给找到的元素
arr[low] = arr[high];
// 左边指针右移一位
low++;
break;
}

// 如果没找到,一直往左找
high --;
}


//从左边开始找比key大的元素
while (low < high) {

// 从左边找到一个比key大的元素
if (arr[low] >= key) {
// 把上一步找到的元素的位置给当前较小元素
arr[high] = arr[low];
// 右边指针左移一位
high --;
break;
}

// 如果没找到,一直往右找
low++;
}


/*
// 另一种循环
for (; left < right; right--) {

if (arr[right] <= key) {
arr[left] = arr[right];
left++;
break;
}
}

for (; left < right; left++) {
if (arr[left] >= key) {
arr[right] = arr[left];
right--;
break;
}
}
*/


// 把较小元素的那个位置放回key元素
arr[low] = key;

return low;
}

void quick_sort(int arr[], int left, int right)
{
if (left < right){

int pos = partition(arr, left, right);

// 分割元素的左边去排序
quick_sort(arr,left,pos-1);

// 分割元素的右边去排序
quick_sort(arr,pos+1,right);
}

}