基礎演算法 插入排序

2021-07-10 17:41:37 字數 1435 閱讀 9519

使用插入排序的演算法有直接插入排序希爾排序

條件:序列a1、a2、… an,分別取和為已排序列(從小到大的順序)和待排序列。

第一步:取待排序列a2與已排序列中的a1比較:

若a1 <= a2則a2新增到已排序列的末尾即已排序列為;

若a1>a2則a2新增到已排序列的首位即已排序列為;

那麼未排序列為。

第二步:取待排序列中的a3,分別與已排序列(或)中的元素從尾到頭比較即a3先與a2進行比較:若a3>=a2則a3加入已排序列,則已排序列變為;

若a3< a2,則繼續與a1進行比較:若a3>=a1則插入到已排序列a2的位置則已排序列變為;若a3第三步:直到取出所有的待排序列中的元素,並插入到已排序列中為止。

// 直接版

void insertsort(int a, int n) }}

}

// 一般版本

// 使用數學概念中的取值範圍來確定要移動元素的索引範圍

void insertsortother(int a, int n)

int temp = a[i];

for (int k = i; k > j; k--)

a[j+1] = temp; // j+1才是a[i]元素最終的位置索引

}}

希爾排序(shell sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。

步驟1:序列中以增量div 劃分原序列為多個新的序列, …. ;

步驟2:分別對新劃分序列進行直接插入排序

步驟3:縮小div值div/ = 2,重新按步驟一方式劃分子串行,進行直接插入排序

步驟n: 當div = 1時,對現有序列進行直接插入排序,得到排序後的序列。

當檔案初態基本有序時直接插入排序所需的比較和移動次數均較少。

當n值較小時,n和 的差別也較小,即直接插入排序的最好時間複雜度o(n)和最壞時間複雜度0( )差別不大。

在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按di-1作為距離排過序,使檔案較接近於有序狀態,所以新的一趟排序過程也較快。

因此,希爾排序在效率上較直接插入排序有較大的改進。

// 直接版

void swap(int *pa, int *pb)

void shellsort(int a, int n)

for (int div = 5; div > 0; div /=2) ,,...

for (int i = 0; i < div; i++)}}

}}

}

基礎演算法 插入排序

參考書籍 演算法導論 第二版 演算法基礎 插入排序演算法 演算法導論 第二版書中一來就提到了插入排序演算法,以撲克牌摸牌來作為比喻,剛開始按照偽 編寫時,容易忽略乙個問題,即用臨時變數來實現陣列中資料的交換問題。由於該演算法確實是演算法中最容易理解與掌 握的,所以不作過多解釋,以下是 include...

基礎演算法 插入排序

今天開始學習演算法,按自己能理解的方式寫了插入排序演算法以便後記.package sortinsert public class sortinsert sort sortdata system.out.println sortdata static int i,j,tmp public static...

基礎排序演算法 插入排序

插入排序,就是如果有乙個已經有序的資料序列,要求在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法 插入排序法,插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序,時間複雜...