快速排序算法C++
快速排序算法每次先随机挑选一个数,把大于这个数的放在右边,小于这个数的放在左边,然后再分别对左右两个区间进行相同的操作。不断递归便能使数组有序;
partition区间划分
区间划分是快速排序算法的核心,主要思路一:
1. 随机选择一个数作为划分值,并将其交换到区间最后一个元素的位置
2. 同时维护一个区间来表示小于等于该元素值所构成的区间
3. 从最区间左边开始将元素i与划分值(最后一个元素)进行比较,如果小于等于划分值则将i与小于等于区间的下一个元素交换位置,并将小于等于区间右移一位
实现方式一:
int partition(int *a, int s, int e){//区间划分
int lower = s-1;
for (int i = s; i < e; i++){
if (a[i] < a[e]){
swap(a[i], a[++lower]);
}
}
swap(a[++lower], a[e]);
return lower;
}
void fastsort(int *a, int s,int e){//递归
if (s >= e)return;
//int mid = fastPartition(a, s, e);
int mid = partition(a, s, e);
fastsort(a, s, mid-1);
fastsort(a, mid + 1, e);
}
实现方式二:
int fastPartition(int *a, int s, int e){//快速排序
int n = e - s + 1;
int temp = a[s];
int ans = 0;
for (int i = s, j = e; j != i; ans = i){
if (a[i] > temp){
swap(a[i], a[j]), j--;
continue;
}
if (a[j] < temp){
swap(a[i], a[j]), i++;
continue;
}
if (a[i] == temp){
j--;
continue;
}
if (a[j] == temp){
i++;
continue;
}
}
return ans;
}
int partition(int *a, int s, int e){
int lower = s-1;
for (int i = s; i < e; i++){
if (a[i] < a[e]){
swap(a[i], a[++lower]);
}
}
swap(a[++lower], a[e]);
return lower;
}