一 简介:
快速排序(有时称为分区交换排序)是一种有效的排序算法,用作系统的方法用于放置的元件阵列中的顺序。由Tony Hoare于1959年开发并于1961年发布,它仍然是一种常用的排序算法。实施得好的话,比主要‘竞争对手’快两三倍左右(归并排序和堆排序)。由于快速排序在实践中的出色表现,所以在JDK1.7中被选中,成为数组排序的底层实现方式。(OpenJDK请看,详细简介请看).
二 实现:
由于快速排序是基于原址排序,这点是不同于归并排序的,这也导致了快速排序能够使用较少的内存资源来操纵
更多的数据。快速排序的核心是获得主元(pivot element),利用主元作为一个分界元素,对数组内的所有元素进行
分界排序,这也可以体现其原理--分治法。
代码实现(python):
def quick_sort(seq):
"""
核心函数是 partitions
:param seq:
:return: 有序的序列
"""
# 装饰器
def quick_sort_decoration(seq,left=None,right=None):
# 获得主元
def partitions(seq,left,right):
temp_key = seq[right]
pre_left = left-1 #左指针维护满足条件(交换后)的记录
for i in range(left,right):
if seq[i] <= temp_key:
pre_left += 1 # 单扫描,维护的是比temp_key小的元素序列
seq[pre_left],seq[i] = seq[i],seq[pre_left]
else:
seq[pre_left+1] ,seq[right] = seq[right], seq[pre_left+1]
return pre_left+1 # 最后一次的记录+1作为主元返回
if left==right==None: left,right=0,len(seq)-1
if left < right:
pivot_element = partitions(seq,left,right) #主元
quick_sort_decoration(seq,left,pivot_element-1) #对左边排序
quick_sort_decoration(seq,pivot_element,right) #对右边排序
quick_sort_decoration(seq)
return seq
代码实现(java)
private static void quickSort(int[] arr,int left ,int right){
int index = partition(arr, left, right);
if(left<index-1)
quickSort(arr, left, index-1);
if(right>index)
quickSort(arr, index, right);
}
private static int partition(int[] arr,int left,int right){
int pivot = arr[(left+right)/2];
while(left<right){
while(arr[left]<pivot) left++;
while(arr[right]>pivot) right--;
if(left<=right){
int temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
left++;right--;
}
}
return left;
}
总结:排序算法作为程序员基本素养,对我们的编程道路影响颇深,学会排序算法后理解、分析出算法的思想,
将会起到事半功倍的效果。共勉!!!