快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据作为standard(通常选用数组的最后一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面(其实只要保证所有比他小的元素都在其前面,则后一条件则自动满足了),这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。(信息来源:百度百科)
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
bool initArray(int *Array, int arraySize)
{
//初始化随机种子
srand(time(NULL));
for (int i = 0; i != arraySize; ++i)
{
//给数组用随机数赋值
Array[i] = rand();
}
return true;
}
/*划分函数:
使得在Array[i+1]之前的元素都小于该元素
在Array[i+1]的元素都小于该元素
*/
template <typename T, typename Index_t>
Index_t partition(T *Array, Index_t prev, Index_t tail)
{
T standard = Array[tail];
Index_t i = prev - 1; //i以及i之前的数,都小于standard
for (Index_t j = prev; j != tail; ++j)
{
//数组的任意元素,只要其小于或等于standard,就将其换到数组的前半段
//(因此,数组的后半段都是大于standard的元素)
if (Array[j] <= standard)
{
++ i;
swap(Array[i],Array[j]);
}
}
swap(Array[i+1],Array[tail]);
//将standard的地址返回
return i + 1;
}
template <typename T, class Index_t>
void quickSort(T *Array, Index_t prev, Index_t tail)
{
if (prev < tail)
{
Index_t q = partition(Array,prev,tail);
//对数组的前半段进行划分
quickSort(Array,prev,q-1);
//对数组的后半段进行划分
quickSort(Array,q+1,tail);
}
}
int main()
{
int arraySize = 10;
int *Array = new int[arraySize];
initArray(Array,arraySize);
quickSort(Array,0,arraySize-1);
for (int i = 0; i != arraySize; ++i)
{
cout << Array[i] << endl;
}
delete Array;
}
原文地址:http://blog.csdn.net/zjf280441589/article/details/41076827