zoukankan      html  css  js  c++  java
  • 快速排序 java详解

    1.快速排序简介:

      快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

    2.快速排序原理:

      a.先选一个基准值(key),一般选取序列第一个数作为基准值。假设最右边的索引为J,最左边的索引为i.

      b.先从右往左比较,(进行j--)直到找到第一个比key小的数,然后把他与key进行交换。

      c.在从左往右比较,(进行i++)直到找到第一个比key大的数,然后把他与key进行交换。

      d.直到i==j,结束第一次循环。此时,key左边的数都比key小,key右边的数都比key大,原序列被分为两个子序列。

      e.递归。将这两个子序列在重复上面a,b,c,d四个步骤。

    3.java代码实现

    package harbin;
    
    import java.util.Scanner;
    
    public class QSort{
        
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入要进行排序的数列的长度: ");
            int n = sc.nextInt();
            int [] a = new int[n];
            System.out.println("请输入要进行排序的数列: ");
            for(int i=0;i<n;i++){
                a[i] = sc.nextInt();
            }
            int x = 0;
            int y = a.length-1;
            QSort.QuickSort(a,x,y);
            
            for(int i=0;i<a.length;i++){
                System.out.print(a[i]+" ");
            }
        }
        
        public static void QuickSort(int[] a,int start,int end){
            int left = start;
            int right = end;
            int key = a[start];
            
            while(left<right){
                while(left<right&&a[right]>=key){//从后向前寻找第一个比key小的值
                    right--;
                }
                if(a[right]<=key){
                    int temp = a[left];
                    a[left] = a[right];
                    a[right] = temp;
                }
                while(left<right&&a[left]<=key){//从前向后寻找第一个比key大的值
                    left++;
                }
                if(a[left]>=key){
                    int temp = a[left];
                    a[left] = a[right];
                    a[right] = temp;
                }
            }
            if(left>start){
                QuickSort(a,start,left-1);
            }
            if(right<end){
                QuickSort(a,right+1,end);
            }
            
        }
    }

    4.例子:

    5.解释:

    原序列为:49 38 66 97 39 68 

    a.选取基准值为49,i=0, j=5;

    b.从右向左找第一个比49小的数,发现j=4时,39<49,所以将39和49进行交换得到序列:39 38 66 97 49 68;

    c.再从左向右找第一个比49大的数,发现i=2时,66>49,将66和49进行交换得到序列:39 38 49 97 66 68;

    d.在重复2,3步骤得到序列为:(39 38)49 (97 66 68)基准值左边的数都比基准值小,右边的都比基准值大

    e.在对左右两个子序列重复以上4步。得到38 39 49 66 68 97

    6.说明:

    快排被公认为在所有同数量级O(nlogn)的排序方法中,平均性能最好,但如果原序列为有序序列时,快排将蜕化为冒泡排序,其时间复杂度为O(n2).

    快排并不稳定

  • 相关阅读:
    C# 进制转换
    使用Struts1完成用户登录功能
    【Maven实战】仓库介绍和Nexus的安装
    【Maven实战】依赖的聚合和版本管理
    【Maven实战】传递性依赖的问题
    【Maven实战】依赖的范围
    【Maven实战】archetype的使用和eclipse的配置
    【Maven实战】Maven开发环境的搭建和案例展示
    【手机安全卫士02】连接服务器获取更新信息
    【手机安全卫士01】项目Splash页面的开发与设计
  • 原文地址:https://www.cnblogs.com/black-mcy/p/10028824.html
Copyright © 2011-2022 走看看