排序算法之快速排序(quick_sort)

快速排序时交换排序的一种,交换排序还有冒泡排序。快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。此时解决方案可以随机打乱序列的顺序。

快速排序不是一种稳定的排序,在于high指针在往左移动的过程中与中枢元素交换的时候会改变相对顺序。

如:49 29 38 49 20 97 76

思路:

1)选择一个基准元素,通常选择第一个元素或者最后一个元素,

2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。

3)此时基准元素在其排好序后的正确位置

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

一次分治partition示例(找到第一个元素的实际位置):



然后贴上java实现的代码,是基于严教材中的思路实现的:

public class quickSort {

    public static void quick_sort(int[] array,int low,int high){
        if(low < high){
            int pivotpos = partition(array, low, high);
            quick_sort(array, low, pivotpos-1);
            quick_sort(array, pivotpos+1, high);
        }
    }

    public static int partition(int[] array,int low,int high){
        int pivot = array[low];  // 将枢纽值设为第一个元素
        while (low<high){
            while (low<high && array[high]>=pivot){high--;}
            array[low] = array[high];
            while (low<high && array[low]<=pivot){low++;}
            array[high] = array[low];
        }
        array[low] = pivot;     // 找到枢纽值所在的位置
        return low;
    }

    public static void main(String[] args) {
        int[] arr = {7,3,1,2,5,4};
        quick_sort(arr,0,arr.length-1);
        for(int i:arr){
            System.out.println(i);
        }
    }
}

代码中数组为形参且没返回 但是其值确改变的原因是:Java方法基本数据类型是传值,对象类型传引用。这里传进来的数组是这个数组的引用,而在方法内部改变了对象的内容,所以实参的值也改变了。

(详见:http://blog.csdn.net/wanliguodu/article/details/55653876)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值