Loading

算法-交换排序算法之快速排序

交换排序

  • 交换排序算法描述:比较相邻两个元素大小,如果反序,则交换。
  • 交换排序算法有两种:冒泡排序和快速排序

快速排序

算法描述

快速排序在数据序列中选择一个元素做为基准值(一般会选择第一个元素或最后一个元素),每趟从数据序列的两端开始交替进行,将小于基准值的元素交换到序列前端,将大于基准值的元素交换到序列的后端,介于两者之间的位置则成为基准值的最终位置。同时,序列被划为两个子序列,在分别对了个子序列进行快速排序,直到子序列的长度为1,则完成排序。

算法思路

image

算法实现

public static void quickSort(int[] arr, int begin, int end) {
    // 序列有效
    if (begin >= 0 && begin < end && end < arr.length) {
        int i = begin, j = end;  // begin 为左边最开始的元素的下标;end 为最后一个元素的下标
        int x = arr[i]; // 以第一个的元素为基准

        while (i != j) { // 当交叉比较时 左边和右边下标发生重合子运行结束
            while (i < j && arr[j] >= x) { // 从右边向前寻找较小的值移动,不移动与基准值相等的元素
                j--;
            }
            if (i < j) {
                arr[i++] = arr[j];  // 子序列的后端较小元素向前移动
            }
            while (i < j && arr[i] <= x) {
                i++;
            }
            if (i < j) {
                arr[j--] = arr[i]; // 子序列前端较大的元素向后移动
            }
        }
        arr[i] = x; // 将基准值放入最终位置
        quickSort(arr, begin, j - 1); // 前端子序列再排序,递归调用
        quickSort(arr, i + 1, end); // 后端子序列在排序,递归调用
    }
}
posted @ 2021-09-23 14:26  白日醒梦  阅读(91)  评论(0编辑  收藏  举报