• 快速排序


    快速排序的基本思想是先找一个基准数,经过分区过程后,使得左边的数都小于这个基准数,右边的数都大于这个基准数,然后对这个基准数左边的子数组和右边的子数组递归进行排序,这样最后基准数左右两边都是已经排序好的子数组;

    排序算法上可以对待排序的数组左右两边分别设置两个哨兵,左边的哨兵从左往右依次扫描,遇到小于基准数的直接通过,遇到大于基准数的停下来,记下位置i,右边的哨兵从右往左依次扫描,遇到大于基准数的通过,遇到小于基准数的停下来,记下位置j,然后比较两个哨兵的位置,如果i < j ,则交换位置i和j上的元素,左右哨兵继续扫描,不管哪边的哨兵与另一个哨兵相遇(也就是他们的下标相等)就都停下来,如果相遇位置的元素小于基准数,则交换基准数和相遇位置的元素,否则不做交换,并且设置partionValue=基准数的新位置下标(如果发生过交换,partionValue=相遇位置,否则partionValue还是等于基准数原来的位置);通过这一轮排序后就可确定partionValue左边的数都小于基准数,partionValue右边的数都大于基准数,然后对partionValue左边的子数组和右边的子数组分别递归排序;

    图解如下:

     

    这个是初始状态,基准数是第一个数6;

    代码实例如下:

     1 void exchange(int arr[], int i, int j) {
     2     int temp = arr[i];
     3     arr[i] = arr[j];
     4     arr[j] = temp;
     5 }
     6 
     7 void QuickSort(int[] arr, int i, int j) {
     8     if (i >= j)  return;
     9     int center = Partion(arr, i, j);
    10     QuickSort(arr, i, center - 1);
    11     QuickSort(arr, center + 1, j);
    12 }
    13 
    14 int Partion(int[] arr, int left, int right) {
    15     int temp = arr[left];
    16     int i = left + 1;
    17     int j = right;
    18     
    19     while (i != j) {
    20         while (i < j && arr[j] >= temp)
    21             j--;
    22         while (i < j && arr[i] <= temp)
    23             i++;
    24         if (i < j)
    25             exchange(arr, i, j);
    26     }
    27     
    28     if (arr[i] < arr[left]) {
    29         arr[left] = arr[i];
    30         arr[i] = temp;
    31         return i;
    32     } else
    33         return left;
    34 }
  • 相关阅读:
    Java中String、StringBuffer和StringBuilder的区别
    Map集合学习
    Set集合学习
    List集合学习
    常用集合类简介及线程安全和非线程安全的集合对象
    JQuery入门
    原生Ajax使用
    JavaScript闭包
    Demo:servlet实现图片的上传
    Android Handler 内存泄漏问题
  • 原文地址:https://www.cnblogs.com/laoxia/p/8941577.html
Copyright © 2020-2023  润新知