TODO:为什么时间复杂度为nlogn?
快排的实现分为两个函数
Partition和QuickSort
时间复杂度为O(nlogn)
实现如下:
//参数如下:
//i初始值为low - 1,指向传入数组的前一个位置;i表示的已经排好顺序且小于KEY的最后一个元素的index;
//j初始值为low,指向数组开始的位置;指向已排序的部分(包括大于key和小于key的部分)的下一个index
//j遍历数组,如果array[j]小于Key,i++;这时i指向的是大于KEY的元素,swap(array[i],array[j])将大于KEY的值(array[i])
//与小于KEY的值(array[j])交换
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 |
int stPartition( int
* array, int
low, int
high) { int
key = array[high]; //KEY为最后一个数组元素 int
i = low - 1; int
j = low; for (;j < high ; j++) { if (array[j] <= key) { i++; //指向大于KEY的第一个位置,同时是这次循环结束之后小于等于KEY的最后一个位置 swap(array[i] , array[j]); } } swap(array[++i],array[high]); return
i; } void
QuickSort( int
* array, int
low, int
high) { cout<<low<< " " <<high<<endl; if (low >= high) return ; int
index = 0; index = stPartition(array,low,high); QuickSort(array,low,index - 1); //因为i指向的是KEY的位置,同时KEY是传入数组的最后一个元素,为了避免再次被选为KEY,传入index-1 QuickSort(array,index,high); } int
main() { int
a[8] = {2,8,7,1,3,5,6,4}; QuickSort(a,0,7); for ( int
i = 0 ; i < 8 ; i++) cout<<a[i]<<endl; return
0; } |
原文:http://www.cnblogs.com/next-ten-years-2023/p/3618210.html