• 排序算法(快速排序)


      关于排序算法,常见的大致有:冒泡排序、插入排序、选择排序、快速排序、归并排序、桶排序、计数排序等。每一种排序算法都有它们各自的优劣和适用场景。一般可以从这么几个角度来衡量排序算法:

      1.最好时间复杂度、最坏时间复杂度、平均时间复杂度

      2.是否是原地排序算法:原地排序算法,指空间复杂度为O(1)

      3.是否是稳定排序算法:稳定排序算法,指如果待排序序列中有值相等的元素,经过排序之后,值相等元素的顺序保持不变

      关于快速排序:

    #描述快速排序:
        1.如果要排序数组中下标从p到r之间的一组数据,我们选择p到r之间的任意一个数据作为pivot(分区点)
        2.遍历p到r之间的数据,将小于pivot的数据放到左边,将大于pivot的数据放到右边,将pivot放到中间
        3.如此,则将p到r之间的数据分成了三个部分,前面p到q-1之间的数据都小于pivot,中间是pivot,后面q+1到r之间的数据都大于pivot
        4.根据分治思想,通过递归排序从p到q-1之间的数据,和下标从q+1到r之间的数据,直到区间缩小为1,则所有数据都有序了
        5.递推公式:
            quick_sort(p…r) = quick_sort(p…q-1) + quick_sort(q+1, r)
    
        终止条件:
            p >= r

      代码实现:

    // 第一步:分区函数
        public static int partition(int[] a,int low,int high){
    
            // 选取第一个元素作为pivot(分区点)
            int tmp = a[low];
    
            // 循环处理low<high
            while (low<high){
    
                // 从右往左,将小于pivot的数据,放入左边
                while(low<high && a[high]>=tmp){
                    high -=1;
                }
                a[low] = a[high];
                System.out.println("1.low="+low+"&&a["+low+"]="+a[low]+",high="+high+"&&a["+high+"]="+a[high]);
    
                // 从左往右,将大于pivot的数据,放入右边
                while(low<high && a[low]<=tmp){
                    low +=1;
                }
    
                a[high]=a[low];
                System.out.println("2.low="+low+"&&a["+low+"]="+a[low]+",high="+high+"&&a["+high+"]="+a[high]);
            }
    
            // 找到分区点low,并返回
            a[low] = tmp;
            System.out.println("找到分区点后的数据:"+Arrays.toString(a));
            return low;
        }
    
     // 第二步:递归操作
        public static void quickSort(int[] a,int low,int high){
            if(low >= high) return;
    
            // 查找分区点
            int mid = partition(a,low,high);
            System.out.println("--------------------------------------分区点:"+mid);
    
            // 低位递归排序
            quickSort(a,low,mid-1);
    
            // 高位递归排序
            quickSort(a,mid+1,high);
        }
  • 相关阅读:
    如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】
    如何向外行解释什么是内存溢出
    【转】21副GIF动图让你了解各种数学概念
    C++buider IDE补丁
    c++buider2010 中.dfm无法打开设计界面的解决方法
    【转】Eclipse 常用快捷键 (动画讲解)
    修身养性,打磨自己
    毕向东java基础课学习笔记5——类型转换
    毕向东java基础课学习笔记——DOS中多命令来回切换的技巧
    vb 本机与SQL远程服务器时间同步
  • 原文地址:https://www.cnblogs.com/itall/p/11155113.html
Copyright © 2020-2023  润新知