没事再写下经典的快排代码,感觉顺手多了……
还是比较懒,Wiki(http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F)介绍如下:
算法
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
- 从数列中挑出一个元素,称为 "基准"(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
最坏情况下,是倒序排好的情况。需要n^2,当时老师说过,加上一个random可以使评价情况变好。既是在partition的循环前,把区间中的随机一个值和data[end]交换。
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
#define ARRAY_SIZE 100
int data[ARRAY_SIZE];
int partition(int data[], int begin, int end)
{
int mid = begin - 1;
for (int i = begin; i < end; i++)
{
if (data[i] < data[end])
{
swap(data[++mid], data[i]);
}
}
swap(data[++mid], data[end]);
return mid;
}
void quickSort(int data[], int begin, int end)
{
if (begin < end)
{
int mid = partition(data, begin, end);
quickSort(data, begin, mid - 1);
quickSort(data, mid + 1, end);
}
}
void Printn(int data[], int size)
{
for (int i = 0; i < size; i++)
{
cout << data[i] << " ";
}
cout << endl;
}
void Getn(int data[], int size)
{
for (int i = 0; i < size; i++)
{
cout << i + 1 << ":\t";
cin >> data[i];
}
}
int main()
{
int size;
while (true)
{
cout << "Please input the data size(no more than " << ARRAY_SIZE << "):(0 to quit.)";
cin >> size;
if (0 == size)
{
break;
}
Getn(data, size);
quickSort(data, 0, size - 1);
Printn(data, size);
}
return 0;
}