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

排序算法之快速排序

2017-07-13 10:44 162 查看
我们先概述下快速排序的过程:对数组A[p,r]进行排序,第一步将数组A[p,r]分解为三部分:A[p,q-1],A[q+1,r],A[q]其中A[p,q-1]中元素全部小于等于A[q],A[q+1,r]中元素全部大于A[q],这样A[q]这个元素就已经排好序了;

第二步对A[p,q-1],A[q+1,r]两个数组递归滴调用该过程就能将A[p,r]数组排好序了。

与归并排序相比,我们发现将数组分解为A[p,q-1],A[q+1,r],A[q]这样的三部分时,如何确定q是该算法的关键,它也直接影响了算法的运行时间。

我们采用rand()函数来保证q的确定是合理的,调用RandomPartition()函数。调用Partition()函数来实现第一步的操作。

下面是代码实现:#include<iostream>
using namespace std;
int Partition(int* arr, int p, int r) {
int i = p - 1;
for (int j = p; j < r; j++) {
if (arr[j] <= arr[r]) {
i++;
swap(arr[i], arr[j]);
}
}
swap(arr[i + 1], arr[r]);
return i + 1;
}
int RandomPartition(int* arr, int p, int r) {
int i = p + rand() % (r + 1 - p);
swap(arr[i], arr[r]);
return Partition(arr, p, r);
}
void QuickSort(int* arr, int p, int r) {

if (p < r) {
int q = RandomPartition(arr, p, r);
cout << q << endl;
for (int i = 0; i < 8; i++) { cout << arr[i] << " "; }cout << endl;
QuickSort(arr, p, q-1);
QuickSort(arr, q+1, r);
}
}
int main() {
int arr[8]={ 2,8,7,1,3,5,6,4 };
QuickSort(arr, 0, 7);
for (int i = 0; i < 8; i++) {
cout << arr[i] << " ";

}
cout << endl;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息