很受打击啊啊啊啊啊!!!这道排序题我很久之前就做过,而且当时没用20分钟就搞定了,可是,今天在公司做完手上的活之后打算刷题时,又心血来潮的想重做一遍,心想反正也花不了多少时间,结果。。。。。血崩了。。。
代码
要求:
对于一个int
数组,请编写一个快速排序算法,对数组元素排序。
给定一个int
数组A
及数组的大小n
,请返回排序后的数组。
测试样例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]
程序:
实现方案一
class QuickSort {
public:
int* quickSort(int* A, int n) {
// write code here
if(n<2){
return A;
}
quickSortIter(A,0,n-1);
return A;
}
private:
void quickSortIter(int* A, int first, int last){ //最重要的是这个迭代函数的设计
if(first<last){
int sep = cutArray(A,first,last);
quickSortIter(A,first,sep-1);
quickSortIter(A,sep+1,last);
}
}
int cutArray(int* A, int first, int last){ //这个分割数组的方法很巧妙,但是,不太好理解,替代方案见程序实现方案二
int reference = A[first];
while(first<last){
while((first<last)&&(A[last]>=reference)){
last--;
}
A[first]=A[last];
while((first<last)&&(A[first]<=reference)){
first++;
}
A[last]=A[first];
}
A[first]=reference;
return first;
}
};
实现方案二
int cutArray(int* A, int first, int last){
int reference = first;
int temp;
while(first<=last){ //这里每一次都选择最后一个元素作为哨兵
if(A[first]<=A[last]){
temp = A[first];
A[first] = A[reference];
A[reference] = temp;
reference++;
}
first++;
}
return reference-1;
}
跪点
最最重要的还是理解递归的思想,然后合理设计递归函数。
后记
最近在看左程云大神的算法公开课,讲的很好很好很好很好很好。。。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。