資料結構與演算法 插入排序(撲克牌排序)

2022-07-08 11:15:16 字數 1239 閱讀 2657

目錄**實現

複雜度分析

演算法優化

插入排序的**實現雖然沒有氣泡排序和選擇排序那麼簡單粗暴,但它的原理應該是最容易理解的了,因為只要打過撲克牌的人都應該能夠秒懂。插入排序是一種最簡單直觀的排序演算法,它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。(有點像撲克牌在手上排序的過程)

插入排序和氣泡排序一樣,也有一種優化演算法,叫做拆半插入。

將待排序序列第乙個元素看做乙個有序序列,把第二個元素到最後乙個元素當成是未排序序列。從頭到尾依次掃瞄未排序序列,將掃瞄到的每個元素插入有序序列的適當位置。(如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的後面。)

在其實現過程使用雙層迴圈,外層迴圈對除了第乙個元素之外的所有元素,內層迴圈對當前元素前面有序表進行待插入位置查詢,並進行移動。

}執行直接插入排序**和二分插入排序**,使用資料集測試執行,得結果如下:

622443661,622443661 // 直接插入排序

711424,622443661 // 二分插入排序

可見二分插入排序大大降低了元素的比較次數,其時間複雜度如下:

最好情況:查詢的位置是有序區的最後一位後面一位,則無須進行後移賦值操作,其比較次數為:log2n 。即o(log2n)。

最壞情況:查詢的位置是有序區的第乙個位置,則需要的比較次數為:log2n,需要的賦值操作次數為n(n-1)/2加上 (n-1) 次。即o(n^2)。

平均時間複雜度:o(n^2)。

從實現原理可知,二分查詢插入排序是在原輸入陣列上進行後移賦值操作的(稱「就地排序」),所需開闢的輔助空間跟輸入陣列規模無關,所以空間複雜度為:o(1)。

撲克牌排序 插入排序演算法解析

簡單理解就是類似摸撲克牌的乙個過程 假定有乙個陣列 int nums new int 現在需要把它變為倒序排序。倒敘排序 如下 詳細排序過程如下 第一次比較,由於nums 1 小於nums 0 直接跳到break,結果為 4,2,5,1,3,6 第二次比較,nums 2 5大於nums 1 2,5和...

資料結構與演算法 插入排序

將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料 插入排序分為兩種 直接插入排序和希爾排序 插入排序與打撲克時整理手上的牌非常類似。摸來的第1張牌無須整理,此後每次從桌上的牌 無序區 中摸最上面的1張並插入左手的牌 有序區 中正確的位置上。為了找到這個正確的位置,須自左向...

演算法與資料結構 插入排序

例如 給定乙個無序陣列int arr n代表集合陣列的長度,給出乙個演算法將陣列arr按照從小到大的順序進行排列。插入排序 看當前位置i的值是否比它前乙個數小,如果小就與前面的數交換位置。public static void insertionsort int arr,int n public st...