排序之快速排序

快速排序的精髓在于如何理解它的算法,我称之为“填坑法”。假入有一数组arr,数组第一个元素的索引为head,最后一个元素的索引为last,把第一个元素“挖”出来,临时保存,记录“坑”的位置,这便是“挖坑”。坑有了,如何“填坑”呢?大致思路是,从最后一个元素开始,逐一递减,直到找到一个元素比临时值小,那么将该数据放入“坑”中,并记录“坑”的位置;然后从第一个元素开始,逐一递增,直到找到一个元素比临时值大,那么将该数据放入“坑”中,并记录“坑”的位置;然后又从last的位置开始往前找比临时值小的元素……像这样循环往复,直到head比last大,最后一定剩下了一个“坑”,并且处于中间位置。这样的结果便是某一元素处于中间位置,它前面的元素都比它小,它后面的远都比它大。核心算法阐述完毕。之后再对该元素前面的元素和后面的元素分别做上述操作即可(递归)。下面给一个用java实现的整型数组快排的例子:

import java.util.Arrays;

public class QuickSort {
  public static void sort(int[] arr, int head, int last) {
    int mid = quickSort(arr, head, last);
    if (mid > head) {
      // 递归
      sort(arr, head, mid - 1);
    }
    if (mid < last) {
      // 递归
      sort(arr, mid + 1, last);
    }
  }

  private static int quickSort(int[] arr, int head, int last) {
    int index = head; //index:记录坑的位置
    int temp = arr[head]; //temp:临时值
    while (head < last) {
      while (last > head) {
        if (arr[last] < temp) {
          arr[index] = arr[last];   //填坑
          index = last;
          break;
        }
        last--;
      }
      while (head < last) {
        if (arr[head] > temp){
          arr[index] = arr[head];   //填坑
          index = head;
          break;
        }
        head++;
      }
    }
    arr[index] = temp;  // 最后把临时值放入坑中
    return index;   //返回中间值的位置
  }

  public static void main(String[] args) {
    int[] arr = new int[]{5,3,2,1,4,2,1,8,9};
    sort(arr, 0, arr.length-1);
    System.out.println(Arrays.toString(arr));
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值