zoukankan      html  css  js  c++  java
  • 数据结构-快速排序

    一. 介绍

    同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。
    不同的是,冒泡排序在每一轮只把一个元素冒泡到数列的一端,而快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分。

    二.流程

    三. 代码

    public class QuickSort {
        public static void main(String[] args) {
            int[] arr = {4, 7, 6, 5, 3, 2, 8, 1};
            quickSort(arr, 0, arr.length - 1);
            System.out.println(Arrays.toString(arr));
        }
    
        private static void quickSort(int[] arr, int startIndex, int endIndex) {
            if (startIndex >= endIndex) {
                return;
            }
            int pivot = partition2(arr, startIndex, endIndex);
            quickSort(arr, startIndex, pivot - 1);
            quickSort(arr, pivot + 1, endIndex);
        }
    
        /**
         * @param arr
         * @param startIndex
         * @param endIndex
         * @return
         */
        private static int partition(int[] arr, int startIndex, int endIndex) {
            //取第一个为基准
            int pivot = arr[startIndex];
            int left = startIndex;
            int right = endIndex;
            //初始 坑的位置
            int index = left;
            //左右重合结束
            while (right >= left) {
                while (right >= left) {
                    if (arr[right] < pivot) {
                        arr[left] = arr[right];
                        index = right;
                        left++;
                        break;
                    }
                    right--;
                }
    
                while (right >= left) {
                    if (arr[left] > pivot) {
                        arr[right] = arr[left];
                        index = left;
                        right--;
                        break;
                    }
                    left++;
                }
            }
            arr[index] = pivot;
            return index;
        }
    
        /**
         * 指针交换
         *
         * @param arr
         * @param startIndex
         * @param endIndex
         * @return
         */
        private static int partition2(int[] arr, int startIndex, int endIndex) {
            //取第一个为基准
            int pivot = arr[startIndex];
            int left = startIndex;
            int right = endIndex;
            //左右重合结束
            while (right != left) {
                while (left < right && arr[right] > pivot) {
                    right--;
                }
                while (left < right && arr[left] <= pivot) {
                    left++;
                }
                if (left < right) {
                    int temp = arr[left];
                    arr[left] = arr[right];
                    arr[right] = temp;
                }
            }
            //pivot和指针重合点交换
            int p = arr[left];
            arr[left] = arr[startIndex];
            arr[startIndex] = p;
            return left;
        }
    
    }
    
  • 相关阅读:
    java后台生成图片二维码
    layui框架下的摸索与学习
    eclipse/myeclipse中js/java的自动提示只有4个字符怎么解决
    Git日常操作指令
    node指南开发练习笔记(1)-- express
    echart全国主要城市某数据的显示
    微信公众号开发获取当前位置
    显示上传图片
    移动端Safari onclick事件兼容
    Plupload上传插件自定义图片的修改
  • 原文地址:https://www.cnblogs.com/gcm688/p/14701069.html
Copyright © 2011-2022 走看看