排序算法之快速排序
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;
}
第二步对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;
}
相关文章推荐
- 排序算法——快速排序
- php排序算法(冒泡排序,快速排序)
- 排序算法六 快速排序
- 排序算法_快速排序
- 几种常见的排序算法及其复杂度——快速排序(二)
- 排序算法(五)——快速排序
- 排序算法复习(Java实现): 插入,冒泡,选择,Shell,快速排序
- 排序算法(三):快速排序和三向快速排序
- 常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)
- 排序算法之快速排序
- 排序算法 之 快速排序
- 排序算法—比较排序之快速排序
- 排序算法之快速排序
- 排序算法:快速排序(挖坑填数+分治)
- C#实现所有经典排序算法(选择排序 冒泡排序 快速排序)
- C++编程练习(16)----“排序算法 之 快速排序“
- 排序算法(七) —— 快速排序
- 【排序算法】快速排序
- 【数据结构】排序算法(二)之交换排序之快速排序(QuickSort)
- 排序算法Java——交换排序(之快速排序)