快速排序基本思想:
1. 分解:将输入的序列array[m,....,n]划分成两个非空子序列array[m,....,k]和array[k+1,....,n],使得array[m,....,k]中的任一元素的值不大于和array[k+1,....,n]中的任一元素的值。
2. 递归求解:通过递归调用快速排序算法分别对array[m,....,k]和array[k+1,....,n]进行排序。
3.合并:由于对分解出的两个子序列的排序是就地进行的,所以在array[m,....,k]和array[k+1,....,n]都排好后,不需要执行任何计算array[m,.....,n]就已经排好了。
#include <iostream> #include <algorithm> #include "string.h" #include "stdio.h" #include <vector> #include <deque> #include<stack> using namespace std; class Sort { public: int* quickSort(int* A, int n) { _quicksort(A,0,n-1); return A; } void _quicksort(int *A,int left,int right) { if(left>=right) return; int partition = Partition(A,left,right); _quicksort(A,left,partition-1);//注意这里的边界条件:partition-1 _quicksort(A,partition+1,right); } int Partition(int* A,int left,int right) { int key = A[left];//取第一个元素作为支点,使得比它小的都在它左边,比它大的都在它右边。 int j = left;//始终指向最后一个比key小的最后一个元素 for(int i=left+1;i<=right;i++) { if(A[i]<key) { swap(A[j+1],A[i]); j++; } } swap(A[left],A[j]);//j指向最后一个比key小的最后一个元素,将支点和A[j]交换,就实现了左边元素都比他小,右边元素都比他大 return j;//返回支点的位置 } }; int main() { int array[]={3,4,5,1,2,8,7}; Sort sort; int len = sizeof(array)/sizeof(array[0]); int* arr = sort.quickSort(array,len); for(int i=0;i<len;i++) { cout<<arr[i]<<" "; } cout<<endl; return 0; }