快速排序算法手稿版

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/sinat_32336967/article/details/98874420

书读百遍,其义自见。果然每次复习都会有不同的收获。

1. 排序过程

快排的详细过程如下图所示。
在这里插入图片描述
在这里插入图片描述
1,2,3,4是一个循环,循环条件是low < high。low==high的时候退出。
然后1和3又是分别是两个循环,用来找到满足条件的数。
第一步的循环条件是low<high && arr[high] >=temp。找到小于temp的数才退出
第二步的循环条件是low<high && arr[low]<=temp。找到大于temp的数才退出。
第三步和第四步就是赋值操作了。
第三步是将找到的小于temp的数arr[high]赋值给arr[low]。
第四步是将找到的大于temp的数arr[low]赋值给arr[high]。
最后循环结束,将temp赋值给arr[low]。
返回此时的下标。递归的对arr[low]->arr[pos-1]以及arr[pos+1]->arr[high]进行快排。

2. 示例代码

package org.jinyuxin.sort.ExchangeSort;

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

  public static void quickSort(int[] arr, int low, int high) {
    if(low < high) {
      int pos = findPosition(arr, low, high);
      //递归对右半边进行快排
      quickSort(arr,low,pos-1);
      //对左半边进行快排
      quickSort(arr,pos+1,high);
    }
  }

  public static int findPosition(int[] arr, int low, int high) {
    //枢纽值
    int temp = arr[low];

    //low等于high的时候退出循环
    while(low < high) {
      //从后向前,直到找到第一个小于temp的数才退出
      while(low< high && arr[high] >= temp){
        high--;
      }
      //找到小于枢纽值的数以后,赋值给arr[low]
      arr[low] = arr[high];

      //从前向后,直到找到第一个大于temp的数才退出
      while(low < high &&arr[low] <= temp) {
        low++;
      }
      //找到大于枢纽值的数以后,赋值给arr[high]
      arr[high] = arr[low];
    }

    //此时将枢纽值赋值给low=high位置
    arr[low] = temp;
    //返回枢纽的最终位置
    return low;
  }
}

3. 示例结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_32336967/article/details/98874420