zoukankan      html  css  js  c++  java
  • 快速排序(交换排序)

    简介:

    快速排序(Quicksort)是对冒泡排序的一种改进。

    它的基本思想是:首先选择一个关键数据作为基准,通过一趟排序将要排序的数据分割成独立的两部分,其中左边的数据小于或等于基准,右边的数据大于或等于基准,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

    实现:

    package suanfa;
    /*
     * 快速排序
     */
    public class QuickSort {
    
         public static void sort(int a[], int low, int hight) {
            if (low > hight) {
                return;
            }
            int i, j, key;
            i = low;
            j = hight;
            key = a[i]; // 用第一个元素作为基准
            while (i < j) { // 从表的两端交替向中间扫描
                while (i < j && a[j] >= key) {
                    j--;
                }
                if (i < j) {
                    a[i] = a[j];
                    i++;
                }
    
                while (i < j && a[i] < key) {
                    i++;
                }
                    
                if (i < j) {       
                   a[j] = a[i];
                   j--;
                }         
            }
            
            a[i] = key;//将基准数值替换回 a[i]          
            
            sort(a, low, i - 1); //递归调用,把key前面的完成排序
           
            sort(a, i + 1, hight); //递归调用,把key后面的完成排序
           
        }
    
         public static void print(int src[]) {
             for (int i = 0; i < src.length; i++) {         
                    System.out.print(src[i] + " ");
                }
             System.out.println();
        }
         
        public static void main(String[] args) {
            int a[] = {6,2,7,3,8,9};
            print(a);
            sort(a, 0, a.length - 1);
            print(a);
         }
    
    }

    分析:

    在快速排序算法中,比较关键的一个部分是主元的选择。

    在最差情况下,划分由n个元素构成的数组需要进行n次比较和n次移动,因此划分需要的时间是O(n)。在最差情况下,每次主元会将数组划分为一个大的子数组和一个空数组,这个大的子数组的规模是在上次划分的子数组的规模上减1,这样在最差情况下算法需要(n-1)+(n-2)+...+1= O(n^2) 时间。

    最佳情况下,每次主元将数组划分为规模大致相等的两部分,时间复杂度为 O(nlogn)

  • 相关阅读:
    飞腾1500A 上面银河麒麟操作系统 进行远程以及添加用户的方法 linux xrdp
    centos7 安装Anaconda3及使用
    机器学习(ML)中文视频教程
    spring学习笔记(26)spring整合Quartz2持久化稳健任务调度
    Cocos2d-X中使用ProgressTimer实现一些简单的效果
    总结几点关于做互联网产品的思路
    norflash和nandflash电路
    存储过程
    USACO hamming 继续暴搜
    [原理分析]Linux下的栈溢出案例分析-GDB调试操练[1]
  • 原文地址:https://www.cnblogs.com/liuzhenping/p/7553818.html
Copyright © 2011-2022 走看看