一. 快速排序(Quick sorting)
快速排序(Quick sorting) 与归并排序类似,同样是一种分而治之的排序算法,其过程可分为以下三个步骤:
- 分离(Partition):
在分离之前应当从数组中选择一个元素满足该元素之前的部分和之后的部分都占整个数组的一半,这样选择的元素称为pivot,然后在分离之前,将pivot放置在首位。如下图所示:
- 递归(Recursion):
在每个部分内利用递归的方法分别进行排序,具体实现方法如下图所示:
- 合并(Conquer):
最后将两部分合并得到最终的排序结果:
由上图分析快速排序在一般情况下的速度如下图:
最差的情况如下图:
由图分析可知快速排序是一种不稳定的排序算法,在最糟糕情况下的时间复杂度为O(n2),平均时间复杂度为O(n*log2(n))。
二. C++ 代码
#include <iostream>
using namespace std;
void partition(int arr[], int first, int last, int &pivotIndex, int order)
{
int pivot = arr[first];
int lastS1 = first;
int firstUnknown = first + 1;
int temp;
if(order == 1)
{
for(; firstUnknown <= last; ++firstUnknown)
{
if(arr[firstUnknown] < pivot)
{
++lastS1;
temp = arr[firstUnknown];
arr[firstUnknown] = arr[lastS1];
arr[lastS1] = temp;
}
}
temp = arr[first];
arr[first] = arr[lastS1];
arr[lastS1] = temp;
pivotIndex = lastS1;
}
else
{
for(; firstUnknown <= last; ++firstUnknown)
{
if(arr[firstUnknown] > pivot)
{
++lastS1;
temp = arr[firstUnknown];
arr[firstUnknown] = arr[lastS1];
arr[lastS1] = temp;
}
}
temp = arr[first];
arr[first] = arr[lastS1];
arr[lastS1] = temp;
pivotIndex = lastS1;
}
}
void QuickSort(int arr[], int first, int last, int arr_size, int order)
{
if(arr_size == last + 1 && first == 0)
{
for(int k = 0; k< arr_size; k++)
cout << arr[k] << " ";
cout << endl;
}
int pivotIndex;
if(first < last)
{
partition(arr, first, last, pivotIndex, order);
for(int k = 0; k < arr_size; k++)
cout << arr[k] << " ";
cout << endl;
QuickSort(arr, first, pivotIndex-1, arr_size, order);
QuickSort(arr, pivotIndex+1, last, arr_size, order);
}
}
int main()
{
int arr_size, order;
int *arr;
cout << "Enter the size of an integer array: ";
cin >> arr_size;
arr = new int[arr_size];
for(int i = 0; i < arr_size; i++)
{
cout << "Enter an integer to be stored at position " << i << " : ";
cin >> arr[i];
}
cout << "Choose the sorting order:\n 1 - Ascending\n 2 - Descending\n ";
cin >> order;
int first = 0;
int last = arr_size - 1;
QuickSort(arr, first, last, arr_size, order);
return 0;
}