数据结构———快速排序

1.原理

基本思想

通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可对这两部分继续进行排序,以达到整个序列有序。

具体实现

选定一个中间数做为参考,所有元素与之比较,小的调到其左边,大的调到其右边。

(枢轴)中间数

可以是第一个数,最后一个数,最中间一个数、任选一个数等。(我这里选择第一个数也就是最左边的数作为枢轴)

2.快速排序算法分析

空间复杂度

由于程序中使用了递归,需要递归调用栈的支持,而栈的长度取决于递归调用的深度。
在平均情况下:需要O(logn)的栈空间
最坏情况下:栈空间可达O(n)

时间复杂度

划分元素的选取是影响时间性的关键。输入数据次序越乱。所选划分元素的随机性越好,排序速度越快,快速排序不是自然排序的方法。改变划分元素 的选取方法,至多只能改变算法平均情况下的性能,无法改变最坏情况下的时间性能,即最坏情况下,快速排序的时间复杂度总是O(n^2)

3.代码实现

public class quickSort {
public static void quickSort(int[] array) {
quickSortInternal(array, 0, array.length - 1);
}

private static void quickSortInternal(int[] array, int left, int right) { 
    if (left == right) { 
        return;
    }
    if (left > right) {
        return;
    }
    int pivotIndex = partition(array, left, right);
    quickSortInternal(array, left, pivotIndex - 1);
    quickSortInternal(array, pivotIndex + 1, right);
}

private static int partition(int[] array, int left, int right){
    int i = left;
    int j = right;
    int pivot = array[left]; 
    while(i < j){
        while(i < j && array[j] >= pivot){
            j--;
        }
        while((i < j) && (array[i] <= pivot)){
            i++;
        }
        swap(array, i, j);
    }
    swap(array, i, left); 
    return i;
}
private static void swap(int[] array, int a, int b){
    int temp = array[a];
    array[a] = array[b];
    array[b] = temp;
}
public static void main(String[] args){  
    int[] array = {5,4,9,7,24,5,49,10};
    quickSortInternal(array, 0, array.length - 1);
    for(int i = 0; i <= array.length - 1; i++){
        System.out.print(array[i]+" ");
    }
}

}

4.代码运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值