排序算法之快速排序

快速排序(QuickSort)

快速排序(QuickSort)属于交换类排序,是通过元素间不断的比较和移动实现的。它的实现,增大了记录移动的距离,通过前后两个指针,依次与基准元素(一般为序列第一个元素或三数取中)进行比较,将比基准元素小的移动到基准前面,比基准元素大的移动到基准后面,通过一趟排序后,基准的位置是其最终位置,并将序列划分为两个子序列,左边子序列元素均小于基准,右边子序列均大于基准,然后采用分治思想,将两个子序列分别递归进行快排,直到子序列中元素为空或只有一个,此时,整个序列有序。其时间复杂度为:O(nlogn)

快排的精髓为

  1. 划分:即通过某趟排序确定出当前基准位置,并由基准将当前序列划分为两个子序列,左子序列元素均小于基准,右子序列元素均大于基准
  2. 递归:采用分治思想对子序列递归调用

快排的Java代码如下:

package QuickSort;
import java.util.Arrays;

/**
 * @author John
 * @date 13/05/2018 5:36 PM
 * @email swjtuzbkoo@gmail.com
 */
public class quickSort {
    public void sort(int[] arr, int low, int high) {
        if (low >= high) {  //递归结束条件,当左侧指针>=右侧指针时,结束
            return;
        }
        int index = partition(arr, low, high);
        sort(arr, low, index - 1); //递归处理左子序列
        sort(arr, index + 1, high); //递归处理右子序列
    }

    public int partition(int[] arr, int low, int high) {//划分
        int key = arr[low]; //以序列第一个元素为基准
        while (low < high) {
            while (low < high && arr[high] >= key) { //从后面向前扫描,移动右侧指针
                high--;
            }
            arr[low] = arr[high];
            while (low < high && arr[low] <= key) { //从前面向后扫描,移动左侧指针
                low++;
            }
            arr[high] = arr[low];
        }
        arr[low] = key;
        return low;
    }

    public static void main(String[] args) {
        quickSort qs = new quickSort();
        int[] arrays = new int[]{1, 12, 2, 13, 3, 14, 4, 15, 5, 16, 17, 17, 177, 18, 8, 8, 19};
        System.out.println("排序前为:"+Arrays.toString(arrays));
        qs.sort(arrays, 0, arrays.length - 1);
        System.out.println("排序后为:"+Arrays.toString(arrays));
    }


}

运行结果如下:

排序前为:[1, 12, 2, 13, 3, 14, 4, 15, 5, 16, 17, 17, 177, 18, 8, 8, 19]
排序后为:[1, 2, 3, 4, 5, 8, 8, 12, 13, 14, 15, 16, 17, 17, 18, 19, 177]

Process finished with exit code 0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值