1、快速排序法概念python
快速排序(Quick Sort)法是对冒泡排序的一种改进,其基本思想是:经过一遍排序将须要排序的数据划分红两部分,使其中一部分数据比另外一部分数据小,而后再分别对这两部分数据继续进行这种排序,按此规则继续,直到每一个部分为空或只含一个数时,整个快速排序结束。这是一种分治策略,将大批的数据逐步分解,可以使用递归的方法编写程序,使程序更简洁。算法
2、算法描述数组
快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:
(1)从数列中挑出一个元素,称该元素为“基准”。
(2)扫描一遍数列,将全部比“基准”小的元素排在基准前面,全部比“基准”大的元素排在基准后面。
(3)经过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列
排序。
下面以一组待排序的数据演示快速排序的过程,假设有8个须要排序的数据序列以下:
69,65,90,37,92,6,28,54
假设数组A中保存着这8个数据,其排序过程如图下图所示。app
(1)在变量left中保存数组的最小序号0,在变量right中保存数组的最大序号7,在变量base中保存数组的第1个元素A[0]做为基准。如上图所示。less
(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,原右侧序号);
}ui
3、快速排序法的实现code
(1)快速排序法
排序
int Division(int a[], int left, int right) { int base = a[left]; while (left < right) { while (left<right && a[right]>base) --right; a[left] = a[right]; while (left<right && a[left]<base) ++left; a[right] = a[left]; } a[left] = base; return left; } void QuickSort(int a[], int left, int right) { int i, j; if (left<right) { i = Division(a, left, right); QuickSort(a, left, i-1); QuickSort(a, i+1, right); } }
(2)数组显示递归
void ShowData(int arr[], int n) { int i; for (i=0; i<n; i++) printf("%d ", arr[i]); printf("\n"); return; }
(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)运行结果
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
运行结果