您的位置:首页 > 编程语言 > C语言/C++

C/C++ 数组排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之快速排序

2018-03-05 11:45 483 查看

快速排序:

给定一个int数组A以及大小n,请返回排序后的数组;

核心思想:

1、选取一个轴值(一般是第一个数),将整个数组小于等于轴值的元素放到轴值左边,大于的放到右边。
1.1、设置一左(i)一右(j)两个指针。
1.2、先从右指针j往左边走,遇到小于轴值(第一个数),将它赋值给左边指针i,并且左边指针i向右移动一个,右指针j停止移动。
1.3、该左边指针i往右边走,遇到大于轴值的,将它赋值给停止移动的右指针j,并且右边指针j向左移动一个,左指针i停止移动。
1.4、循环1.2、1.3步,直到指针i和指针j碰头。
1.5、再将轴值存到A[i]里面,这样就将整个数组小于等于轴值的元素放到轴值左边,大于的放到右边。
2、以轴值为中心将数组分为两半,递归的调用步骤1,直到所有元素都有序。



代码

class QuickSort {
public:
int* quickSort(int* A, int n) {

quickProcess(A,0,n-1);

return A;
}

void quickProcess(int *A, int start, int end){
if(start >= end)  //== 为什么不可以,可以思考一下
return;

int value = A[start];  //轴值
int i= start;
int j = end;

//找到放轴值的合适位置,并且将小的放左边大的放右边
while(i<j){
while(i<j && value<=A[j]){
j --;
}
if(i<j){
A[i++] = A[j];
}

while(i<j && value>A[i]){
i++;
}
if( i<j){
A[j--] = A[i];
}
}

//将轴值放到最终位置
A[i] = value;

//左右分开递归调用
quickProcess(A, start, i-1);
quickProcess(A, i+1, end);

}
};
main调用:#include <iostream>
using namespace std;
int main(){
int AAA[]={1,3,6,9,2,5,4,8,7};
QuickSort Q;
int *b=Q.quickSort(AAA,9);
for(int i=0;i<9;i++){
cout<<b[i]<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐