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

      快速排序算法跟归并排序算法一样,都是利用的是分治原则,通过不断将一个未排序的数组进行划分排序,直到最后组成一个有序的数组。快速排序算法的原理就是从未排序的数组中取出一个数(一般是第一个或者是最后一个元素)作为主元,将未排序数组中小于这个主元的元素放在主元的左边,大于主元的元素放在主元的右边。然后再将主元左边小于主元的所有元素按照上面的方法进行处理,右边的元素也一样,以此类推。直到划分到最后左右两边的数组只剩下一个元素,排序就完成了。接下来我们用一幅图来演示下快速排序算法:

      从上面的图中可以看出划分完成时,数组排序就完成了。

      下面为快速排序算法的java代码:

      程序分为两个方法,方法QuickSort进行判断是否继续进行划分,方法Partition进行选取主元,对未排序数组进行划分。

           public static void QuickSotrt(int[] array,int head,int tail){
                if(head < tail){
                    // 获取主元位置
                    int k = Partition(array, head, tail);
                    // 对主元左边元素进行再次划分
                    QuickSotrt(array, head, k-1);
                    // 对主元右边数组进行再次划分
                    QuickSotrt(array, k+1, tail);
                }
            }
            
            public static int Partition(int[] array ,int head, int tail){
                    // 选取第一个作为主元进行划分
                    int j = head;
                    int temp;
                    // 循环数组中的数,与数组的第一个数据进行比较划分
                    for(int i=head+1;i<=tail;i++){
                        if(array[i] < array[head]){
                            temp = array[i];
                            array[i] = array[++j];
                            array[j] = temp;
                        }
                    }
                    
                    // 将主元放在左右数组的中间位置
                    temp = array[head];
                    array[head] = array[j];
                    array[j] = temp;
                    return j;
            }

      快速排序算法的时间复杂度为O(n^2),在随机选取主元的快速排序算法中,期望时间复杂度可以达到O(nlogn),空间复杂度为O(logn)。

  • 相关阅读:
    ASP.NET Cache的一些总结分享
    C#中委托和事件的区别实例解析
    [hdu2544]最短路spfa
    [codeforces274b]Zero Tree(树形dp)
    [poj2151]Check the difficulty of problems概率dp
    [poj3071]football概率dp
    [poj3744]Scout YYF I(概率dp+矩阵快速幂)
    [bzoj2440]完全平方数(二分+mobius反演)
    [xdoj1216]子树第k小(dfs序+主席树)
    [xdoj1233]Glory and LCS
  • 原文地址:https://www.cnblogs.com/huangweikun/p/5150851.html
Copyright © 2011-2022 走看看