演算法 排序 插入排序(直接插入和希爾排序)

2021-07-06 11:11:49 字數 1634 閱讀 5944

這裡介紹兩種插入排序演算法:

1、直接插入排序

2、希爾排序

基本思想:

1、直接插入排序:直接插入排序即從資料第二個數開始進行比較,當它比前乙個值小時,將它不斷向前移動,知道它的值不再比它前面的值大,被他超過的值依次向後移動一位,如此反覆,知道最後乙個數排序完畢,即可得到排序後的序列。插入排序與打撲克時整理手上的牌非常類似。摸來的第1張牌無須整理,此後每次從桌上的牌(無序區)中摸最上面的1張並插入左手的牌(有序區)中正確的位置上。為了找到這個正確的位置,須自左向右(或自右向左)將摸來的牌與左手中已有的牌逐一比較。

2、希爾排序:希爾排序類似直接插入排序,但不同的是希爾排序在對序列進行排序之前會對序列進行分組,先對每一組進行排序,然後逐漸減小組距,在次進行排序,直到最後組距為1時,就是直接插入排序了,這樣就可以得到排序後的序列。排序過程模擬:注意希爾排序最後的乙個組距必須為1;它是不穩定排序。

1、直接插入排序:

#include 

#include

using

namespace

std;

//輸出函式

void sort(vector

&l)

}}int main()

; vector

v;for(int i=0; i<10; i++)

v.push_back(a[i]);

sort(v);

for(int j=0; j<10; j++)

cout

<< v[j] << " ";

return

0;}

2、希爾排序:

//希爾排序, 改進的直接插入排序

#include

#include

using

namespace

std;

//#define n 20

const

int n = 20; //定義常量

//輸出函式

void disp(vector

vec)

cout

<< endl;

}void shell( vector

&vec);

//注意向量引數為引用型別,不然無法輸出排序後結果

void shellstep(vector

&vec, int d);

int main()

; for(int i = 0; i < n; i++)

disp(vec1);

shell(vec1);

disp(vec1);

return0;}

void shell(vector

&vec) //迴圈分組間隔

while(st>1);

}void shellstep(vector

&vec, int d)

//從第乙個元素開始,每隔d個距離取乙個元素,對這些元素進行直接插入排序

while(j>=0 && temp < vec[j] );

//主要while與do while 的條件判斷模式

vec[j+d] = temp;}}

}

插入排序 直接插入 希爾排序

直接插入排序是將元素按順序插入已經排好序的序列中。對於待插入的元素,如果比最後乙個元素還大,則不用處理。否則,從後邊元素開始比較,並順次後移,直到碰到元素小於或者等於該元素。設定第乙個元素位置為哨兵,用來存放待插入元素。include include include using namespace ...

插入排序(直接插入 希爾)

排序策略 在有序表的恰當處插入乙個新元素,並保持該有序表的有序性 即,當插入第n個元素時,前n 1個元素已經是有序排列 排序過程 以集合中資料為例 初始儲存 第一趟 插入38 第二趟 插入65 第三趟 插入97 第四趟 插入76 第五趟 插入13 第六趟 插入27 第七趟 插入49 一共有八個資料,...

插入排序 (直接插入排序和希爾排序)

當插入第i i 1 個元素時,前面的src 0 src 1 src i 1 已經排好序,此時用src i 的排序碼與 src i 1 src i 2 的排序碼順序進行比較,找到插入位置即將src i 插入,原來位置上的元素順序後移 void insertsort int src,int n 直接插入...