zoukankan      html  css  js  c++  java
  • 复习一下排序算法

    因为找实习时候碰见笔试题出算法题的,在这里复习一下学习过的排序算法的思路。(以数组理思路)


    算法性能:

    算法的稳定性:如果Ai = Aj,排序前Ai在Aj之前,排序后Ai还在Aj之前,则称这种排序算法是稳定的

      


    冒泡排序:

    1. 比较相邻的元素,如果前一个比后一个大/小,就把它们两个调换位置。
    2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大/小的数。
    3. 针对所有的元素重复以上的步骤,除了最后一个。
    4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    效果展示:

     


     选择排序:

    选择排序就是,先查找数组中最大(最小)的元素,将其置换到初始位置,接着在剩下的元素中查找其中最大(最小)的元素,将其置换到之前那个元素之后,以此类推,直到所有元素均排序完毕。


    插入排序:

    插入排序利用的是,在数组中第P个元素调整位置时,前面的p-1个元素都已经排序完毕。

    算法的实现(此处以升序为例):

    1. 默认数组第一个元素已排好序,从第二个元素开始取并将待排序的元素赋予一个临时表,若a[1]<a[0],则将a[0]往后挪,将位置让出来方便临时变量插入,即令此时的a[1]=a[0](a[1]的值已经赋予临时变量)。
    2. 前面两个元素排好序后,取第三个元素(将其赋予临时变量)从后往前与前面的元素比较,若前面的元素大于它,需向后挪位置。以此类推,知道最后一个元素插入完毕。
     for (int i = 1; i < n; i++)         // 取需要排序的目标元素
        {
            int get = A[i];                 // 将这个目标待排序的赋予临时变量
            int j = i - 1;                  // 从后往前开始比较
            while (j >= 0 && A[j] > get)    
            {
                A[j + 1] = A[j];            // 如果被比较的比目标大,就将其右移
                j--;
            }
            A[j + 1] = get; // 直到被比较的元素比目标元素小(或二者相等),将目标元素插入该元素右边(相等元素的相对次序未变,所以插入排序是稳定的)
        }


    希尔排序:

    希尔排序使用一个序列h1,h2,h3,……hk,只要h1=1(即最简单的插入排序),任何的增量序列都是可行的。在使用增量序列hk进行排序时,将每隔hk的元素看成一个区间,忽略其他元素,将其排序,而并在他们实际的位置上进行交换。

     


    快速排序(以升序为例):

    1. 如果数组元素为0或1,则返回;
    2. 任取数组中一元素V,将其设为枢纽元(pivot)
    3. 将数组中的剩余元素划分成大于V和小于V两部分
    4. 划分的部分重复上述操作,直至为1的情况。

    设置两个指针,left和right,left从左往右找比枢纽元大的数,找到即停止,right从右往左依次找比枢纽元小的数,找到即停止,如果此时,left对应的数组下标小于right的,则两者对应的数组元素交换位置。交换位置后,两指针继续查找,当到left与right相遇,left停止查找,此时若right对应的元素若依旧大于枢纽元,则right继续查找,找到符合要求的元素后与枢纽元交换位置即可。此时枢纽元左边都是小于它的数,右边都是大于它的数,再对划分好的区域重复上述操作,即可排序完毕。

  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/JhonFlame/p/8067888.html
Copyright © 2011-2022 走看看