快速排序(java)

快速排序的基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分的值均比另一部分的值小,再分别对两部分继续进行排序,直到整个序列有序。

稳定性:由于关键字的比较和交换是跳跃进行的, 快速排序不是一种稳定的排序方法。

public class Sort {
  public static void quickSort(int arr[], int low, int high){
    int pivot;
     if (low < high) {
       pivot = partition(arr, low, high);
       quickSort(arr, low, pivot -1); //对左半部分递归排序
       quickSort(arr, pivot + 1, high); //对右半部分递归排序
    }
  }

  public static int partition(int arr[], int low, int high){
    int pivotValue = arr[low];
    while(low < high) {
      while(low < high && arr[high] > pivotValue) high--;
      swap(arr, low, high);
      while(low < high && arr[low] < pivotValue) low++;
      swap(arr, low, high);
    }
    return low;
  }

  public static void swap(int  arr[], int index_1, int index_2){
    int temp = arr[index_ 1];
    arr[index_1] = arr[index_2];
    arr[index_2] = temp;
  }

   public static void main(String[] args) {
        int[] sortArray = {50, 10, 90, 30, 70, 40, 80, 60, 20};
        Sort.quickSort(sortArray, 0, sortArray.length - 1);
        for(int num: sortArray) {
            System.out.println(num + " ");
        }
   }
}

时间复杂度:最优O(nlogn), 最差O(n^2), 平均O(nlogn)
空间复杂度:对栈的空间的使用,最优O(logn), 最差O(n), 平均O(l**ogn)

快速排序优化:

1.优化选取枢轴: 随机选取, 对小数组三数取中,对大数组九数取中

//三数取中
int pivotValue;
int m = low + (high - low) / 2
if (arr[low] > arr[high]) {
  swap(arr, low, high);
}
if(arr[m] > arr[high]) {
  swap(arr, m, high);
}
if(arr[low] > arr[m]) {
  swap(arr, low, m);
}

2.优化不必要的交换
直接将枢轴移到最终位置

  public static int partition(int arr[], int low, int high){
    int pivotValue = arr[low];
    while(low < high) {
      while(low < high && arr[high] > pivotValue) high--;
      arr[low] = arr[high]
      while(low < high && arr[low] < pivotValue) low++;
      arr[high] = arr[low]
    }
    arr[low] = pivotValue;
    return low;
  }

3.优化小数组时的排序
数组非常小时,直接插入排序更好

public static void quickSort(int arr[], int low, int high){
  if(arr.length > 50) {
    int pivot;
    if (low < high) {
      pivot = partition(arr, low, high);
      quickSort(arr, low, pivot -1); //对左半部分递归排序
      quickSort(arr, pivot + 1, high); //对右半部分递归排序\
    } 
  } else {
    Insertsort(arr, low, high)
  }
}

4.优化递归操作
减少递归次数

public static void quickSort(int arr[], int low, int high){
  if(arr.length > 50) {
    int pivot;
    while (low < high) {
      pivot = partition(arr, low, high);
      quickSort(arr, low, pivot -1); //对左半部分递归排序
      low = pivot + 1;
    } 
  } else {
    Insertsort(arr, low, high)
  }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会...
    JourWon阅读 6,637评论 0 34
  • 0、排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明 稳定:如果a原本在b...
    SithCait阅读 6,208评论 0 37
  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可...
    意识流丶阅读 8,391评论 2 9
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,333评论 0 13
  • 没错,我不善于交流,可是那只是对于不熟悉的人!荘荘,你算我最熟悉的人!你身边发生的大大小小的事我都清楚,你的身份证...
    alosterloster阅读 1,267评论 0 0