快速排序Java版(通俗易懂)

快速排序的算法是:

快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。

代码如下:

public class Quicksort {
    public static void main(String[] args) {
        int[] arr = new int[]{5,3,6,2,8,7,9};
        int start = 0;
        int end = 6;
        Quicksort.quickSort(arr, start, end);
        for(Integer i : arr) {
            System.out.print(i+" ");
        }
    }

    private static void quickSort(int[] s, int start, int end) {
        if (start < end) {
            int i = start;
            int j = end;
            int x = s[start];
            while (i < j) {  // 当比到 i 和 j 重合的时候,就停止比较
                while (i < j && x < s[j]) {  // 从右往左找一个比首位数小的数
                    j--;   // 从右边往左边找时,如果没找到比首位数小的数,就会一直比
                }
                if (i < j) {
                    s[i] = s[j];  // 找到比第一个小的数后,进行交换,把小的数赋值给第一个数
                    i++; // 在交换后,把下标往右移一位,不然需要多比一次
                }
                while (i < j && s[i] < x) { // 从左往右找一个比交换后的数(首位数)大的数
                    i++; // 从左边往右边找时,如果没找到比交换后的数(首位数)大的数,就会一直比
                }
                if (i < j) {
                    s[j] = s[i]; // 找到比交换后的数(首位数)大的数后,进行交换,把大的数进行赋值
                    j--; // 在交换后,把下标往左移一位,不然需要多比一次
                }
            }
            /*
             * 当比到 i 和 j 重合的时候,就停止比较,把交换后的数(首位数)赋值给当前下标为 i 的数组
             * 此时,就得到了一个中位数,该中位数左边的数都小于它,该中位数右边的数都大于它。
             * */
            s[i] = x;
            quickSort(s, start, i-1);  // 把中位数左边的数,以同样的方式进行,也就是递归
            quickSort(s, i+1, end);   // 把中位数右边的数,进行递归即可
        }

    }

}

排序演示
假设一开始序列{xi}是:5,3,7,6,4,1,0,2,9,10,8。

此时,ref=5,i=1,j=11,从后往前找,第一个比5小的数是x8=2,因此序列为:2,3,7,6,4,1,0,5,9,10,8。

此时i=1,j=8,从前往后找,第一个比5大的数是x3=7,因此序列为:2,3,5,6,4,1,0,7,9,10,8。

此时,i=3,j=8,从第8位往前找,第一个比5小的数是x7=0,因此:2,3,0,6,4,1,5,7,9,10,8。

此时,i=3,j=7,从第3位往后找,第一个比5大的数是x4=6,因此:2,3,0,5,4,1,6,7,9,10,8。

此时,i=4,j=7,从第7位往前找,第一个比5小的数是x6=1,因此:2,3,0,1,4,5,6,7,9,10,8。

此时,i=4,j=6,从第4位往后找,直到第6位才有比5大的数,这时,i=j=6,ref成为一条分界线,它之前的数都比它小,之后的数都比它大,对于前后两部分数,可以采用同样的方法来排序。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
快速排序是一种常用的排序算法,它的基本思想是通过一趟排序将待排序记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后分别对这两部分记录继续进行排序,重复以上步骤,直到整个序列有序。 简单来说,就是将一个无序的序列分成两部分,一部分比另一部分小,然后对这两个部分分别进行快速排序,最终得到一个有序序列。 下面是java快速排序代码实现: ``` public class QuickSort { public static void quickSort(int[] arr, int left, int right) { if (left < right) { int pivotIndex = partition(arr, left, right); quickSort(arr, left, pivotIndex - 1); quickSort(arr, pivotIndex + 1, right); } } private static int partition(int[] arr, int left, int right) { int pivot = arr[left]; int i = left + 1; int j = right; while (true) { while (i <= j && arr[i] < pivot) { i++; } while (i <= j && arr[j] > pivot) { j--; } if (i >= j) { break; } swap(arr, i, j); } swap(arr, left, j); return j; } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {5, 3, 7, 2, 8, 4, 1, 6}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } } ``` 以上代码实现了快速排序算法,其中partition方法用来找到基准点(pivot)的位置,swap方法用来交换数组中两个元素的位置。在main方法中,我们给出一个待排序的数组,然后调用quickSort方法进行排序,最后输出排序后的结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值