排序算法.md

初级排序算法


  1. 游戏规则
    1. 关注对象是重新排列数组元素的算法。
    2. 大多数情况只会两种方法操作数据:less()exch().
    3. 排序成本模型:需要计算比较和交换的数量。对不交换的算法,会计算访问数组的次数。
    4. 自定义的数据类型,只需要实现一个compareTo() 方法来定义目标类型对象的自然序列。通常对于> < = ,返回值用(-1 0 +1)。
  2. 排序分类

这里写图片描述

选择排序

  1. 简单选择排序
    1. 每次选出剩余最小的元素,并与剩余未交换的第一位进行交换。
    2. 交换总次数N。时间效率取决于比较次数。n方/2次比较,n次交换。
public class Selection{
    public statice void sort(String[] a){
        int len = a.length;
        for (int i = 0; i < len-1; i++){
            int min = i;
            int temp;
            for (int j = i+1; j < len; j++){
                if ( a[j] < a[min]){
                    min =j;
               }
               temp = a[min]; a[min] = a[i]; a[i] = a[min];
           }
       }
   }
}
  1. 堆排序
    1. 时间复杂度为O(nlogn),空间复杂度为O(1)
    2. 堆排序借用数据结构,二叉堆。
      二叉堆的性质:父节点的键值总是>=子节点键值;每个节点都是一个一个二叉堆。
    3. 经常用在 大数Top K问题上。
public class HeapSort{
    private int[] arr;

    public void HeapSort(int[] arr){
        this.arr = arr;       
    }
    /*堆有序第一步
    *数据化堆
    */
    for (int i = arr.length/2; i > 0; i--){
        heapAdjust(arr, i, arr.length);
    }

    /*堆有序第二步
    *堆排序
    */
    for(int i = arr.length - 1; i > 0; i--){
        swap(arr, 0, i);
        heapAdjust(arr, 0, i);
    }

    /* 构建堆的过程 
     * @param arr 需要排序的数组 
     * @param i 需要构建堆的根节点的序号 
     * @param n 数组的长度 
     */ 
     private static void heapAdjust(int[] arr, int i, int n){
         while (2*i+1 < n){
             int j = 2*i+1;
             if (j < n && (arr[j] < arr[j+1]))
                 j++;
             if (!(arr[j] < arr[k]))
                 break;
             exch(arr, k, j);
             k = j;
         }
         private static int exch(int[] arr, int i, int n){
             int t = arr[i];
             arr[i] = arr[n];
             arr[n] = t;
         }
     }

}

插入排序

  1. 直接插入排序
    1. 将其余所有元素插入到之前的元素中。
    2. 当前索引左边的都是有序数列。
    3. 插入排序所需时间,取决于当前的初始顺序,因此对非随机数组更有效。
public void InsertSort(int[] arr){

    for (int i = 1; i < arr.length; i++){
        if (a[i] < a[i-1]){
            int j = i-1;
            int x = a[i];
            a[i] = a[i-1];
            while(x < a[j]){
                a[j+1] = a[j];
                j--;
            }
            a[j] = x;
        }
    }
}
  1. 希尔排序
    1. 基于插入排序,快速算法。
    2. 交换不相邻的元素,以对数组局部最优;然后用插入排序对局部最优排序。
    3. 任意间隔h的元素都是有序。
public void shellSort(int[] arr, int n){
    int dk = n/2;
    while(dk >= 1){
        ShellInsertSort(arr, n, dk);
        dk = dk/2;
    }

    private void ShellInsertSort(int[] arr, int n, int dk){
        for (int i = dk; i < n; i++){
            if (a[i] < a[i-dk]){
                int j = i-dk;
                int x = a[i]
                while(x < a[j]){
                    a[j+dk] = a[j];
                    j -= dk;
                }
                a[j] = x;
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章