1. 程式人生 > >插入排序--直接插入排序

插入排序--直接插入排序

    插入排序的基本思想是:每次將一個待排序的元素插入到已排好序的子表的合適位置上。以下的排序都是按照增序進行排列。

一、插入排序思路

    1、假設待排序的元素存放在陣列R[0 ...n-1]中,共n個待排元素。在排序的某一刻時, 有序區R[0 ...i-1],無序區R[i ...n-1]。i的初始值為1,即有序區中僅有一個元素R[0]。在該時刻,要做的是將無序區的第一個元素,即R[i]插入到有序區的合適位置,即插入到有序區R[0 ...i-1]。為了將R[i]插入有序區的合適位置,需要逐次和有序區元素比較,直到R[i]>=有序區的某元素停止。在比較過程中,滿足R[i]<有序區元素的需要進行位置替換。

    直接插入排序的一趟操作是將當前無序區的第一個元素,插入到有序區R[0 ...i-1]的合適位置。然後R[0 ...i]成為新的有序區。

二、排序演算法

/***********************************************************************
* FUNCTION:    直接插入排序
* AUTHOR:      zhuzi
* DATE:        2018-5-01
* VERSION:     v1.0
* NOTES:       
* MODIFICATION:
**********************************************************************/
#include <iostream>

using namespace std;

typedef int KeyType;
typedef int InfoType;

typedef struct 
{
    KeyType key;
    InfoType data;
}RecType;

/*********************************************************************
* function:        直接插入排序
* parameters:      RecType R[], 待排序陣列
                   int n, 陣列個數
* return value:    無
**********************************************************************/
void InsertSort1(RecType R[], int n)
{
    int i, j;
    RecType tmp;
    
    for(i = 1; i < n; i++)
    {
        tmp = R[i];
        j = i - 1;
        
        while((j >= 0) && (tmp.key < R[j].key) )//進入內迴圈,交換元素的條件
        {
            R[j+1] = R[j];
            j--;
        }
        R[j + 1] = tmp;
    }
}

/*********************************************************************
* function:        輸出元素
* parameters:      RecType R[], 有序區陣列
                   int n, 陣列元素個數
* return value:    無
**********************************************************************/
void print(RecType R[], int n)
{
    for(int i = 0; i < n  ; i++)
    {
        cout << "R[" << i << "] <" << R[i].key << "," << R[i].data << ">" << endl;
    }
}

int main(int argc, char *argv[])
{
    RecType RT[] = {{1,11},{3,33},{2,22},{5,55},{7,77},{8,88}};

    InsertSort1(RT, sizeof(RT)/sizeof(RT[0]));

    print(RT, sizeof(RT)/sizeof(RT[0]) );
    
    return 0;
}

三、演算法分析

    直接插入演算法由兩重迴圈構成,對於具有n個元素的表,外迴圈要進行n-1趟排序。每一趟排序中,僅當帶插入元素R[i].key>=R[i-1].key時,才不會進入內迴圈,即不用進行元素移動。

    若初始資料為正序,則在每趟排序中比較一次,不會進入內迴圈,但會執行tmp = R[i]; R[j + 1] = tmp; 即移動兩次。正序插入排序中,關鍵字比較次數為:n-1,元素移動次數為2(n-1)。

    若初始資料為逆序,則在每趟排序中需要比較i次,移動i+2次。逆序插入時,關鍵字比較次數為:n(n-1)/2 = O(n^2), 元素移動次數為:(n-1)(n-4)/2=O(n^2)。

    演算法的平均複雜度是O(n^2),因為平均的比較次數為i/2, 平均的移動次數為i/2+2,故平均時間複雜度約為O(n^2)。(i/2+i/2+2)=(i+2)=(n-1)(n-4)/2=O(n^2)

相關推薦

數據結構-排序-直接插入排序

回顧 撲克牌 整理 是個 ack sort pan ID ostream                 直接插入排序   直接插入排序類似對撲克牌的整理,初始情況下把前面第一個看作有序序列,然後後面全是無序。   這個排序寫過很多遍,但是每次回顧都感覺到設計者精彩巧妙的安

插入排序——直接插入排序(StraightInsertionSort)

原理 從第一個元素開始,該元素可以認為已經被排序 取出下一個元素,在已經排序的元素序列中從後向前掃描 如果該元素(已排序)大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置 將新元素插入到該位置後 重複步驟2~5 <?php /** *

資料結構之內部排序--直接插入排序

概要 -IDE:Pycharm -Python版本:python3.x -演算法分類:內部排序->插入類排序->直接插入排序 演算法思想 直接插入排序是一種最基本的插入排序方法,其基本操作是將第$i$個記錄插到前面$i-1$個記錄中。然後將大於自身的記錄從後往前依次向後移一位. 例如:將第$

排序--直接插入排序

按元素由小到大排列,直接插入排序主要過程如下:選取一個元素,從已經有序的序列的最後一個元素開始由後向前查詢插入的位置,如果該元素<前面的元素則交換位置,直到該元素>=前面的元素。如對5、4、3、2、1排序過程如下: 1、    由於4<5

排序演算法--插入排序--直接插入排序

//插入排序--直接插入排序 void print_insert_sort_list(int list[] , int count) {     for(int i = 0 ; i < count ; i++)     {         printf("%5d" ,

java實現---插入排序----直接插入排序和希爾排序

插入排序 直接插入排序 希爾排序 直接插入排序 直接插入排序,把待排序的元素插入到前面排好序的一組元素的合適位置上去 在前面已經排好序的元素中,從後往前找 publ

插入排序--直接插入、折半插入

  昨天寫了交換排序的演算法(包括氣泡排序、快速排序),今天寫一寫插入排序。插入排序有三種:直接插入排序、折半插入排序、希爾排序。時間有限,今天先寫一下直接插入排序和折半插入排序,希爾排序等明天有時間再寫!   插入排序是將未排序序列中的元素依次拿出來與已排序序列中的元素進行比較,插入到已排

Java陣列的高階部分:氣泡排序+選擇排序+直接插入排序+快速排序+折半查詢

1.氣泡排序 (1)氣泡排序的思想       兩兩比較,大的往後放,第一次比較完畢之後,最大值就出現在了最大索引處!然後依次這樣比較,就可以得到一個排好序的陣列. (2)氣泡排序的規律  1)一定是兩兩比較,大的往後放,第一次比較完畢,最大值在最大索引處  2)第

插入排序--直接插入排序

    插入排序的基本思想是:每次將一個待排序的元素插入到已排好序的子表的合適位置上。以下的排序都是按照增序進行排列。一、插入排序思路    1、假設待排序的元素存放在陣列R[0 ...n-1]中,共n個待排元素。在排序的某一刻時, 有序區R[0 ...i-1],無序區R[i

排序演算法: 氣泡排序, 快速排序,希爾排序,直接插入排序直接選擇排序,歸併排序,堆排序

幾種排序演算法分析:   氣泡排序:   氣泡排序的方法排序速度比較慢。   思路:進行n-1排序,第一次排序先找出最小的數字,放在第一個位置,然後在剩餘的數字中再找出最小的數字,放在第二個位置上,依次類推,可以排出所有的數字。   當然也可以從大到小的排序。   例如

C++程式碼,資料結構-內部排序-插入排序-直接插入排序

開始內部排序的學習, 直接插入排序還是很簡單的 #include<iostream> #include<cstdlib> using namespace std; //第十章 內部排序 //待排記錄資料的資料結構 #define maxsize

排序——直接插入排序

設計思想 直接插入排序是將線性序列中的元素分為有序部分和待排序部分,每次第一個取待排序數進入排序部分查詢到相應位置插入,使有序部分依舊有序,直到整個序列有序。 演算法步驟: 將第一待排序序列第一

排序——直接選擇排序(簡單選擇排序

無序 代碼 .... 插入排序 相對 方法 import 排序 color 直接選擇排序也稱簡單選擇排序,是一種相對簡單的排序算法,它的基本思想是:從一列數中找出最小的,和第一個交換;剩下的重新找出最小的,和這列數的第二個交換,......一直進行n-1次比較之後,該數列已

【資料結構】【排序】選擇排序(直接選擇排序、堆排序)

【資料結構】【排序】選擇排序 ①簡單選擇排序 每次從序列中找出最大/最小元素,插入已排列部分的最後。 過程: 1、設一個變數min,先放在第一個元素的位置,設i,j,i=0,j=i+1。 2、在未排序陣列中找到最小的賦給min,與i比較,開始交換 3、i++  j+

資料結構與演算法-----選擇排序-----直接選擇排序

package jzoffer; public class DirectSelectionSort { public static void main(String[] args) { int [] R = {10,9,8,7,6,5,4,3,2,1}; Syst

Java與算法之(9) - 直接插入排序

set reat 正是 stat copy boa 派生 creat 人的 直接插入排序是最簡單的排序算法,也比較符合人的思維習慣。想像一下玩撲克牌抓牌的過程。第一張抓到5,放在手裏;第二張抓到3,習慣性的會把它放在5的前面;第三張抓到7,放在5的後面;第四張抓到4,那麽我

直接插入排序(Straight Insertion Sort)

temp wap 序表 maxsize 得到 進行 efi size 長度 直接插入排序(Straight Insertion Sort)的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表。 /* 對順序表L作直接插入排序 */ v

InsertionSort 直接插入排序(java)

string static 數字 nbsp ava 思想 oid sta and 排序思想: 相當於一堆數字,一開始先取出2個數排序,2個數排好序之後,再從一堆數字裏面取一個數排序,直到結束偽代碼: INSERTION_SORT(A) for j = 2 to A.leng

【算法拾遺(java描寫敘述)】--- 插入排序直接插入排序、希爾排序

ecan itblog insert med image java程序 can rip title 插入排序基本思想 每次將一個待排序的記錄按其keyword大小插入到前面已經拍好序的子文件的適當位置,直到全部記錄插入完畢為止。 直接插入

直接插入排序(高級版)之C++實現

include ostream 源代碼 cpp -s 臨時 ios 結束 中間變量 直接插入排序(高級版)之C++實現 一、源代碼:InsertSortHigh.cpp 1 /*直接插入排序思想: 2  假設待排序的記錄存放在數組R[1..n]中。初始時,R[1]自成