排序算法系列(5)——直接插入排序

直接選擇排序是選擇排序中最基礎的一部分
在此拿出來講是為了為后面的折半選擇排序希爾排序(縮小增量排序)做好鋪墊,打好基礎


中心思想:

  1. 首先有一個需要排序的array [ 定義一個變量len = array.length]
  2. 先認為array[0]是一個已經排好序的序列,認為array[1]~array[len-1]是無序序列。
  3. 那么就開始遍歷了,首先 令 i=1
  4. 那么將array[i] 需要插入已經有序的序列array[0]~array[i-1]中。
    然后就形成了 有序序列array[0]~array[i]
  5. 然后 i++i<len [也就是說數組沒有out of index 還是存在無序序列的]執(zhí)行步驟4 否則也就是i>=len的時候就說明所有的無序序列都被插入到了有序的序列中也就是說已經排好序列了。

圖的例子:

說了那么多還是上個圖比較實在,圖的排序過程很形象。


直接選擇排序.png

代碼實現:

根據看了一些博客啥的,發(fā)現直接排序實現方案有幾種,在此將自己了解到的列出來。

1. my-version
package directInsertion;

import java.util.Arrays;

/**
 * 直接插入排序 默認的排序規(guī)則為從小到大的排序方式
 * 
 * @author mengf
 *
 */
public class Main {

    public static int[] directInsertionSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            // 判斷array[i]需要放入的array的正確位置 j記錄正確位置的index
            int j = i - 1;
            for (; j >= 0; j--) {
                // 一旦比前面某個大就說明在那個后面一個
                if (array[j] <= array[i]) {
                    j++;
                    break;
                }
                // array[i]應該在0位置的情況
                if (j == 0) {
                    break;
                }
            }

            int temp = array[i];
            // 找到array[i]對應的位置之后就需要插入
            for (int k = i; k > j; k--) {
                array[k] = array[k - 1];
            }
            array[j] = temp;
        }

        return array;
    }

    public static void main(String[] args) {
        int[] array = { 5, 9, 6, 2 };
        directInsertionSort(array);
        System.out.println(Arrays.toString(array));
    }
}

說實在的我個人能力有限,弄成這樣我就滿意了,但是之后發(fā)現網上有更簡潔的代碼,一比較才發(fā)現自己是多么的麻煩
發(fā)上一個簡單版本:

2. simple version

這是一個邊移動 邊比較的方法 相當于my-version將內循環(huán)中的兩個for糅合
my-version 是先比較完確定好位置之后 再移動

package directInsertion;

import java.util.Arrays;

/**
 * 直接插入排序 默認的排序規(guī)則為從小到大的排序方式
 * 
 * @author mengf
 *
 */
public class Main {

    public static int[] directInsertionSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            // 只有i比前面一個排好序的小的時候才說明需要前移 否則說明不需要前移
            if (array[i] < array[i - 1]) {
                int temp = array[i];
//              //邊比較邊移動
//              for (int j = i - 1; j >= 0; j--) {
//                  if (array[j] > temp) {
//                      array[j + 1] = array[j];
//                      if (j == 0) {
//                          array[j] = temp;
//                      }
//                  } else {
//                      array[j + 1] = temp;
//                      break;
//                  }
//              }
                //這樣寫可以不像上面那樣 把j=0 挑出來 防止數組邊界溢出
                //想想很有道理?。。?!
                int j = i - 1;
                for (; j >= 0 && array[j] > temp; j--) {
                    array[j+1] = array[j];
                }
                array[j+1] = temp;
            }
        }

        return array;
    }

    public static void main(String[] args) {
        int[] array = { 5, 9, 6, 2 };
        directInsertionSort(array);
        System.out.println(Arrays.toString(array));
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 某次二面時,面試官問起Js排序問題,吾絞盡腦汁回答了幾種,深感算法有很大的問題,所以總計一下! 排序算法說明 (1...
    流浪的先知閱讀 1,252評論 0 4
  • 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,303評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,828評論 0 15
  • 7/6/2017《超級個體》吾愛廬 主要內容回顧 一、大腦———倒著生長的神經網絡 大腦是倒著生長發(fā)育的器官,前期...
    吾愛廬閱讀 604評論 0 1
  • 身披密密尖刺外衣/圓的,扁的,方的,錐形的個頭/在金九銀十季節(jié)/紛紛脫去外衣墜地 板栗對于很多老家在農村的人來說,...
    牧野俊風閱讀 1,922評論 5 5

友情鏈接更多精彩內容