九大排序算法之快速排序(原理及实现)

1、算法原理:以一个数为中心将序列分成两个部分,一边全是比它小,另一边全是比它大。

2、算法思路:一个军训小栗子,教官说“第一个同学出列,其余同学以他为中心,矮的全排到他的左边,高的全排到他的右边。”这就是一趟快速排序。

3、算法过程

举个栗子(第一趟的排序过程)

原始序列:49、38、65、97、76、13、27、49

                   i                                                      j

1)进行第一趟快速排序,以第一个数49为枢轴,整个过程是一个交替扫描和交换的过程(ij分别指向头、尾元素)

2)使用j,从序列最右端开始向前扫描,直到遇到比枢轴49小的27,j停在这里

49、38、65、97、76、13、27、49

 i                                             j

3)将27交换到序列前端i的位置

27、38、65、97、76、13、49、49

 i                                             j

4)这时使用i,换扫描方向,从左到右扫描,直到遇到比枢轴49大的数65,i停在这里

27、38、65、97、76、13、49、49

                 i                              j

5)将65交换到序列j的位置

27、38、49、97、76、13、65、49

                 i                              j

6)换扫描方向,从右到左扫描,直到遇到比枢轴49小的数13,j停在这里

27、38、49、97、76、13、65、49

                 i                      j

7)将13交换到序列i的位置

27、38、13、97、76、49、65、49

                 i                      j

8)换扫描方向,从左到右扫描,直到遇到比枢轴49大的数97,i停在这里

27、38、13、97、76、49、65、49

                       i                j

9)将97交换到序列j的位置

27、38、13、49、76、97、65、49

                       i                j

10)换扫描方向,从右到左扫描,直到遇到比枢轴49大的数,如果ij形象与,说明扫描结束,此时49位置就是最终排序位置。

27、38、13、49、76、97、65、49

                       ij

11)可以看出一次排序后,将原来的序列以49为枢轴,划分为两个部分,49左边数都比它小,右边数都比它大,接下来同样方法对序列{27、38、13}和{76、97、65、49}分别进行排序。

public class QuickSort {

    public static void main(String[] args) {
        int arr[] = {49、38、65、97、76、13、27、49};
        quickSort(arr, 0, 7);
        System.out.println(Arrays.toString(arr));
    }

    public static void quickSort(int[] arr, int left, int right) {

        if (left < right) {
            // 一次划分
            int mid = partion(arr, left, right);
            quickSort(arr, 0, mid - 1);
            quickSort(arr, mid + 1, right);
        }
    }

    public static void swap(int[] arr, int l, int r) {
        int tmp = arr[l];
        arr[l] = arr[r];
        arr[r] = tmp;

    }

    public static int partion(int[] arr, int left, int right) {
        // 轴值,默认选取数组的第一个数字
        while (left < right) {
            while (left < right && arr[left] <= arr[right]) {
                right--;
            }
            if (left<right){
                swap(arr, left, right);
            }
            while (left < right && arr[left] <= arr[right]) {
                left++;
            }
            if (left<right){
                swap(arr, left, right);
            }
        }
        return left;
    }

}

猜你喜欢

转载自blog.csdn.net/changhangshi/article/details/82736203
今日推荐