排序算法之快速排序

3 篇文章 0 订阅
1 篇文章 0 订阅

一 简介:

 快速排序(有时称为分区交换排序)是一种效的排序算法,用作系统的方法用于放置的元件阵列中的顺序。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;
}
 总结:排序算法作为程序员基本素养,对我们的编程道路影响颇深,学会排序算法后理解、分析出算法的思想,
将会起到事半功倍的效果。共勉!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值