快速排序的实现

先写代码,一会再总结

public class TestQuickSort {

  public static void main(String[] args) {
    int[] array = {6, 4, 5, 2, 3, 1};
    for (int x : array) {
      System.out.print(x + " ");
    }

    System.out.println();
    quickSort(array, 0, array.length - 1);
  
    for (int x : array) {
      System.out.print(x + " ");
    }
  }
    
  //  对分割元素左右段数组进行递归快排,直到左右数组只剩下1个元素为止,left代表数组的起始坐标,right代表数组的终点坐标
  public static void quickSort(Comparable[] array, int left, int right) {
    //  当left==right时,说明左边或右边的数组只剩下1个元素,跳出快排
    if (left < right) {
      int i = findPartition(array, left, right);
      quickSort(array, left, i - 1);
      quickSort(array, i + 1, right);
    }
  }

  //  寻找并返回分割元素坐标
  public static int findPartition(Comparable[] array, int left, int right) {
    int i = left;
    int j = right;

    //  用数组第一个元素做为分割元素
    Comparable partitionElement = array[left];
    Comparable temp;

    while (i < j) {
   
      //  从右向左搜索第一个小于分割元素的元素,找到后交换两者的位置
      //  容易知道j左移的时候 array[i]就是分割元素,同理 i 右移的时候,array[j]就是分割元素
      while (i < j && array[j].compareTo(partitionElement >= 0) {
        j--;
      }

      if (i < j) {
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;
      }

      //  从左向右搜索第一个大于分割元素的元素,找到后交换两者的位置
      while (i < j && array[i].comparaTo(partitionElement <= 0) {
        i++;
      }
 
      if (i < j) {
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;
      }
    }
  }
}
        
    

总结出的几个问题:
1.快排有两种实现方法:
  (1)第一种如我的代码所示,从右向左找(从右想做找)的跳出条件为(i < j),并且在找到元素后立即与分割元素交换位置.看这一步
  
//  从右向左搜索第一个小于分割元素的元素,找到后交换两者的位置
      while (i < j && array[j].compareTo(partitionElement >= 0) {
        j--;
      }

      if (i < j) {
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;
      }


  (2)第二种是从右向左找(从右想做找)的跳出条件为(i < right) right为数组边界,并且找到元素后不和分割元素交换值,而是交换左右两个找到的值.具体实现略过

2.我这种方法只能先从右往左找第一个小于分割元素的元素
  不能先从左往右找第一个大于分割元素的元素

你可能感兴趣的:(J#)