2019独角兽企业重金招聘Python工程师标准>>>
一、快速排序法概念
快速排序(Quick Sort)法是对冒泡排序的一种改进,其基本思想是:通过一遍排序将需要排序的数据划分成两部分,使其中一部分数据比另一部分数据小,然后再分别对这两部分数据继续进行这种排序,按此规则继续,直到每个部分为空或只含一个数时,整个快速排序结束。这是一种分治策略,将大批的数据逐步分解,可使用递归的方法编写程序,使程序更简洁。
二、算法描述
快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:
(1)从数列中挑出一个元素,称该元素为“基准”。
(2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。
(3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列
排序。
下面以一组待排序的数据演示快速排序的过程,假设有8个需要排序的数据序列如下:
69,65,90,37,92,6,28,54
假设数组A中保存着这8个数据,其排序过程如图下图所示。
(1)在变量left中保存数组的最小序号0,在变量right中保存数组的最大序号7,在变量base中保存数组的第1个元素A[0]作为基准。如上图所示。
(2)从数组右侧开始,逐个取出元素与base比较,直到找到比base小的数据为止。在本例中,数组最右侧的元素A[right]的值54就比base变量中保存的值69小。
(3)将右侧比基准base小的数(数组元素A[right]中的数)保存到A[left](A[0])元素中。
(4)接下来,从数组左侧开始,逐个取出元素与base比较,直到找到比base大的数据为止。在本例中,数组最左侧的元素A[left](即A[0])的值为54,比base的值小,将left自增1(值为1)。再取A[left](A[1])的值65与base的值69比较,65<69,继续将left自增1(值为2)。再取A[left](A[2])的值90与base比较,因90>69,结束查找。
(5)将左侧比基准base大的数(数组元素A[2])保存到A[right](A[7])元素中。
(6)将base中的值保存到A[left](A[2])中。经过这些运算,得到如图4-6b所示的效果。
提示 经过这一次分割,base数据左侧(也就是left所指向的数据)的数比base小,而base数据右侧的数比base大。
(7)接下来,通过递归调用,将left左侧的数据进行同样的排序,再将left右侧的数据进行同样的排序。
经过这样的递归调用,最终可将数据完成排序操作。
从前面的分析可知,快速排序是一个递归过程,其算法描述如下:
void快速排序(数组,左侧序号,右侧序号)
{
分割数据,将left保存到i
快速排序(数组,原左侧序号,i-1);
快速排序(数组,i+1,原右侧序号);
}
三、快速排序法的实现
(1)快速排序法
int Division(int a[], int left, int right)
{
int base = a[left];
while (left < right) {
while (leftbase)
--right;
a[left] = a[right];
while (left
(2)数组显示
void ShowData(int arr[], int n)
{
int i;
for (i=0; i
(3)测试
#define ARRAYLEN 10
int main(int argc, char *argv[])
{
int i;
int a[ARRAYLEN] = {94, 84, 54, 80, 62, 83, 37, 24, 67, 29};
printf("原数据:");
ShowData(a, ARRAYLEN);
QuickSort(a, 0, ARRAYLEN-1);
printf("排序后:");
ShowData(a, ARRAYLEN);
return 0;
}
(4)运行结果
四、python实现快速排序法
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def quicksort(array):
less = []
greater = []
if len(array) <= 1:
return array
pivot = array.pop()
for x in array:
if x <= pivot:
less.append(x)
else:
greater.append(x)
return quicksort(less) + [pivot] + quicksort(greater)
if __name__ == "__main__":
array = [94, 84, 54, 80, 62, 83, 37, 24, 67, 29]
print "原数据:", array
sort_array = quicksort(array)
print "排序后:", sort_array
运行结果