快速排序原理,演示及代码

快速排序原理及代码

1.原理(分治)

一次遍历将随机数列分为左右两区,使得左区所有数字小于基数小于右区,两区再分别重复策略,实现快速排序。

2.操作

  • 在随机数列随机选取一个数字作为基数(一般选取第一个数字-简单)
  • 将数列中小于基数的数字放入基数左侧,反之放右侧(一般采用双指针方式)
  • 左右两侧分别使用以上策略,直到本侧只有一个数字为止(递归实现)

3.演示

初始数列:5 2 9 4 7 1 6 3

选取基数:tmp=5 (存储起来),采用双指针遍历:红色代表low(应小于基数),蓝色代表high(应大于基数),从high开始执行;

5 2 9 4 7 1 6 3

3<基数5,令arr[low]=arr[high],low++

3 2 9 4 7 1 6 3

每赋值一次便交换一次执行方向:2<基数5,low++

3 2 9 4 7 1 6 3

9<基数5,arr[high]=arr[low],high--

3 2 9 4 7 1 6 9

6>基数5,high--

3 2 9 4 7 1 6 9

1<基数5,arr[low]=arr[high],low++

3 2 1 4 7 1 6 9

4<基数5,low++

3 2 1 4 7 1 6 9

7>基数5,arr[high]=arr[low],high--

3 2 1 4 7 7 6 9

此时红色low与蓝色high相遇变成了紫色,遍历结束,令紫色位置=tmp

3 2 1 4 5 7 6 9

下面运用递归将左右两区分别重复此操作,直至每区长度等于1,则递归结束,快排完成。

4.代码

       /**
        * @param arr 随机数组
        * @param low 本分区的开头
        * @param high 本分区的结尾
        * @return 排序后的数组
        */
        public int[] quickSort(int[] arr, int low, int high) {
            if (low >= high) {
                return arr;
            }
            int tmp = arr[low], originLow = low, originHigh = high;
            int flag = 1;//1表示从右到左
            while (low != high) {
                if (flag == 1) {
                    if (arr[high] <= tmp) {
                        arr[low] = arr[high];
                        low++;
                        flag = 0;
                    } else {
                        high--;
                    }
                } else {
                    if (arr[low] >= tmp) {
                        arr[high] = arr[low];
                        high--;
                        flag = 1;
                    } else {
                        low++;
                    }
                }
            }
            arr[low] = tmp;
            arr = quickSort(arr, originLow, low - 1);
            arr = quickSort(arr, low + 1, originHigh);
            return arr;
        }
posted @ 2023-10-06 09:48  懒艾  阅读(117)  评论(0)    收藏  举报