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

    插入排序


    插入排序的算法时间是O(N^2)。

    int key = 0;
    int length = s.length();
    for (int i = 1; i < length; i++) {
         key = ints[i];
         int j = i-1;
         while ( j>=0 && key < ints[j]) {
              ints[j+1] = ints[j];
              j--;
         }
    }
    

    希尔排序


    希尔排序是通过比较一个相距间隔内的元素进行排序。简单说来,n=ints.length,第一次排序将n=N/2作为第一次排序的增量,将ints数组每n=n/2个元素做一次间隔,对间隔内元素进行排序。以此类推,直到对n=1时进行排序。因此,希尔排序也叫缩减增量排序
    1.使用希尔增量时希尔排序的最坏情形运行时间为O(N^2)。
    2.使用Hibbard增量的希尔排序的最坏情形运行时间为O(N^3/2)。

    public static int[] pro(int[] ints) {
            int n = ints.length;
            int gap = n/2;
            while(gap > 0){
                for(int j = gap; j < n; j++){
                    int i=j;
                    while(i >= gap && ints[i-gap] > ints[i]){
                        int temp = ints[i-gap]+ints[i];
                        ints[i-gap] = temp-ints[i-gap];
                        ints[i] = temp-ints[i-gap];
                        i -= gap;
                    }
                }
                gap = gap/2;
            }
            return ints;
        }
    

    堆排序


    堆排序的运行时间为O(NlogN)。我们在理解堆排序的思想需要明白大根堆和小根堆的概念。
    对N个互异项的随机排列进行堆排序所用比较的平均次数为2NlogN-O(NloglogN)。
    大根堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
    小根堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]
    1.将给定的数组按二叉树形式进行层序遍历。
    2.然后从最后一个非叶子节点开始进行结构调整,原则是按照大根堆/小根堆的排列结构。节点调整顺序是从右至左,从下至上。
    3.结构调整结束后,将根节点与最后一个叶子节点互换。将原根节点从堆中去除,放入数组中。
    4.重新调整结构。

    我们可以将上述操作带入到数组中。
    a.将无需序列构建成一个堆,根据升序降序需求选择大根堆或小根堆;
    b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
    c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。
    根据图示看一下。

  • 相关阅读:
    做了一个非常小的WPS插件
    小幸福
    被迫积极
    将要从csdn搬过来了!
    游戏框架设计Ⅰ—— 游戏中的事件机制
    *VB中实现OpenGL的截屏(glReadPixels)
    *D3D中把场景保存为图片的方法
    *vc中检测内存泄露的工具VLD(visual leak detector) 转
    纯虚函数能为private吗?
    vc中调用Com组件的方法详解
  • 原文地址:https://www.cnblogs.com/njuptzheng/p/12831078.html
Copyright © 2011-2022 走看看