标签:第一次用 第一个 namespace 不用 第k大 style 比较 color 技术
原创、转载请注明出处。
快速排序优点:
速度快,不需要辅助空间。
分治:
划分问题:把数组的各个元素重排后分成左右2部分,使得左边任意元素都小于或等于右边任意元素。
递归求解:把左右2部分分别排序。
合并问题:不用合并,因为此时数组已经完全有序。
“划分过程”有多个版本,我第一次用的把第一个数作为基准,从前向后和从后向前分别找1个(找2个),交换。在处理细节时很麻烦,出了很多问题,后来用了找一个就交换的方法,个人感觉细节问题较少,代码如下:
#include<iostream> using namespace std; void print(int A[], int x, int y)//输出A[x,y] { for(int i = x; i <= y; i ++) { cout << A[i] << ‘ ‘; } cout << endl; } void f(int A[], int x, int y)//把[x,y]划分成左右2个序列(不包括mid) { if(x >= y) { return ; } int i = x, j = y, flag = 0, mid;//flag是0代表基准数下标是i,1代表基准数下标是j while(i != j) { if(A[i] > A[j]) { swap(A[i], A[j]); flag = 1 - flag; if(flag)//基准数下标是j,i右移 { i ++; } else//基准数下标是i,j左移 { j --; } } else//不交换 { if(flag) { i ++; } else { j --; } } } mid = i;//i = j f(A, x, mid - 1); f(A, mid + 1, y); } int main() { int n, A[1000]; cin >> n; for(int i = 0 ; i < n ; i ++) { cin >> A[i]; } f(A, 0, n-1); print(A, 0, n-1); return 0; }
20
6 1 5 4 8 3 9 12 51 11 15 14 13 25 69 47 56 74 26 78
快速选择问题:
输出一个序列排序后第k大的数。借鉴快速排序的思想,序列分成2个左右2个序列后,可以根据第一序列的长度和k比较来确定是在左序列还是在右序列找。
快速排序的时间复杂度为:最坏情况O(n2),平均情况O(nlongn),但实践中几乎不可能达到最坏的情况,效率非常高。根据快速排序思想,可以在平均O(n)时间内选出数组中第k大的元素。
标签:第一次用 第一个 namespace 不用 第k大 style 比较 color 技术
原文地址:http://www.cnblogs.com/mu-ye/p/7705690.html