一、快速排序
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
1、从数列中挑出一个元素,称为"基准"(pivot)
2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
3、在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
4、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
三、快速排序的特点
1、最差时间复杂度O(N2),平均情况下O(NlogN)
2、平均需要比较2NlnN次
四、代码
#include <iostream>
using namespace std;
/*
快速排序
*/
template <typename type>
int partion(type data[], int lo, int hi)
{
int i = lo, j = hi;
type provit = data[lo];//选出基准值
while (i < j)
{
while (i < j && data[j] >= provit)
j--;
data[i] = data[j]; //将比基准值小的调整到前面
while (i < j && data[i] <= provit)
i++;
data[j] = data[i];//将比基准值大的调整到后面
}
data[i] = provit; //将基准值放在合适的位置
return i;
}
template <typename type>
void quick_sort(type data[], int lo, int hi)
{
if (lo < hi)
{
int mid = partion(data, lo, hi);
quick_sort(data, lo, mid - 1);
quick_sort(data, mid + 1, hi);
}
}
int main()
{
int a[] = { 1, 3, 2, 4, 6, 5, 8, 7, 0, 9 };
quick_sort(a, 0, 9);
for (int i = 0; i < 10; i++)
cout << a[i] << "\t";
return 0;
}
#coding=gbk
'''
Created on 2015年5月14日
@author: Nicholas
'''
class Sort():
@staticmethod
def partion(data,lo,hi):
i = lo
j = hi
provt = data[lo]
while(i<j):
while(i<j and data[j]>=provt):
j -= 1
data[i] = data[j]
while(i<j and data[i] <= provt):
i += 1
data[j] = data[i]
data[i] = provt
return i
@staticmethod
def quick_sort(data,lo,hi):
if(lo <hi):
k = Sort.partion(data, lo, hi)
Sort.quick_sort(data, lo, k-1)
Sort.quick_sort(data, k+1, hi)
@staticmethod
def PrintValue(data):
for e in data:
print(e,)
if __name__ == '__main__':
a = [1,3,2,4,6,8,7,9,0,5]
s = Sort()
s.quick_sort(a,0,9)
s.PrintValue(a)