zoukankan      html  css  js  c++  java
  • Java排序算法之快速排序

    基本过程:

    1. 设置两个变量i、j,排序开始的时候:i=0,j=N-1;
    2. 以第一个数组元素作为关键数据,赋值给key,即key=a[0];
    3. 从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
    4. 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
    5. 重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止)。

    代码实现:

    public class KuaiSu {
        public static void main(String []args){
            int[] a = {12,20,5,16,15,1,30,45,23,9};
            int low = 0;
            int high = a.length-1;
            paixu(a,low,high);
            for(int i = 0; i<a.length; i++){
                 System.out.print(a[i]+",");
             }     
         }
        
        public static void paixu(int[] a,int low,int high){
            if(low<high){
                int key = sort(a,low,high);
                paixu(a,low,key-1);
                paixu(a,key+1,high);
            }
        }
         
         
        public static int sort(int[] a,int low,int high){
             int key = a[low];         
             while(high>low){
                 //从后往前比较
                 while(high>low&&a[high]>=key){  //若大于key移动位置
                     high--;
                 }
                 a[low]=a[high];  //不大于,交换两个值
    
                 //从前往后比较
                 while(high>low&&a[low]<=key){  //若小于key移动位置
                     low++;
                 }
                 a[high]=a[low];   //不小于,交换两个值
             }
             a[low]=key;
             return low;
            }
    }

    算法性能分析:

    时间复杂度:快速排序最坏的时间复杂度为O(n^2),平均时间复杂度为O(nlogn)。

    空间复杂度:O(n)。

    稳定性:因为存在key和其他元素的交换,会打乱原来序列的排序。比如序列为 5 3 3 4 3 8 9 10 11, 现在key元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法,

    不稳定发生在key和a[j] 交换的时刻。

     
  • 相关阅读:
    深入理解计算机系统(3.2)---数据格式、访问信息以及操作数指示符
    深入理解计算机系统(3.1)---走进汇编的世界
    linux下的usb抓包方法
    Linux中查看系统资源占用情况的命令
    中药介绍
    shell中的for循环用法详解
    Linux上shell脚本date的用法
    linux下的shell运算(加、减、乘、除)
    [linux time命令学习篇] time 统计命令执行的时间
    一文简述多种强化学习算法,重要概念和术语一览
  • 原文地址:https://www.cnblogs.com/love-Stefanie/p/6641771.html
Copyright © 2011-2022 走看看