麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

排序算法 之 插入排序

2019-11-10 20:38:25
字體:
供稿:網(wǎng)友

原文地址 http://www.cnblogs.com/liukemng/p/3716164.html

本次介紹排序算法中的插入排序。

 

1.直接插入排序:

基本思想:

直接插入排序也需要對待排序的序列在外層進行n-1次遍歷,每次遍歷時只把本次遍歷次數(shù)處的元素和該元素之前的元素進行比較,來決定插入位置,并把從插入位置開始到該元素之前的所有元素后移,使從序列開始到該元素為止序列中的元素有序,直至遍歷完成序列整體有序,插入排序算法的時間復(fù)雜度為O(n2);

如下表格所示為待排序的序列:

321765489

當進行第一次遍歷時把元素e[1]和e[0]作比較,e[1]<e[0],所以e[1]插入e[0]的位置e[0]元素后移,第一次遍歷后序列中元素排列順序如下:

231765489

當進行第二次遍歷時把元素e[2]和e[0]、e[1]作比較,e[2]<e[0],所以e[2]插入e[0]的位置e[0]、e[1]元素后移,第二次便利后序列中元素排列順序如下:

123765489

然后繼續(xù)進行遍歷,直至序列遍歷完成…

代碼實現(xiàn):

復(fù)制代碼
/// <summary>/// 直接插入排序/// </summary>/// <param name="intArray"></param>/// <param name="length"></param>public static void InsertSort(int[] intArray, int length){    int i, j, k, temp, insertIndex;    for (i = 1; i < length; i++)    {        insertIndex=0;        temp = intArray[i];        for (j = i - 1; j >= 0; j--)        {            if (temp > intArray[j])            {                insertIndex = j+1;                break;            }        }        if (insertIndex != i)        {            for (k = i; k > insertIndex; k--)            {                intArray[k] = intArray[k - 1];            }            intArray[insertIndex] = temp;        }    }}復(fù)制代碼

2.改進的插入排序算法:

在上面的插入排序算法中,我們先對本次排序中的元素進行循環(huán)比較找出插入位置,然后找出插入位置并把從插入位置處的元素進行后移,如果插入的位置不是元素本身的位置就多了元素后移操作,我們可以把元素比較和元素后移操作放在同一個循環(huán)中提高效率;

代碼實現(xiàn):

復(fù)制代碼
/// <summary>/// 直接插入排序優(yōu)化1/// 在比較的同時移動元素/// </summary>/// <param name="intArray"></param>/// <param name="length"></param>public static void InsertSort1(int[] intArray, int length){    int i, j, temp, insertIndex;    for (i = 1; i < length; i++)    {        if (intArray[i] < intArray[i - 1])        {            temp = intArray[i];            insertIndex = i;            for (j = i - 1; j >= 0 && temp < intArray[j]; j--)            {                intArray[j + 1] = intArray[j];                insertIndex = j;            }            intArray[insertIndex] = temp;        }    }}復(fù)制代碼

3.折半插入排序:

基本思想:

折半插入排序外層遍歷與直接插入排序外層遍歷相同,不同的是每次遍歷時把本次遍歷次數(shù)處的元素與之前排序好的元素序列中間的元素作比較,如果小于中間的元素則把中間元素的前一個元素作為新的比較序列的末尾元素,待插入元素重新與新序列中間元素比較,如果大于中間元素則把中間元素的后一個元素作為新的比較序列的起始元素,待插入元素重新與新序列中間元素比較,直至新序列開始元素的位置大于結(jié)束元素的位置搜索結(jié)束,找出插入位置并移動元素,折半插入排序算法的時間復(fù)雜度仍為O(n2),但效率依然比直接插入排序高;

代碼實現(xiàn):

復(fù)制代碼
/// <summary>/// 折半插入算法/// </summary>/// <param name="intArray"></param>/// <param name="length"></param>public static void BinaryInsertSort(int[] intArray, int length){    int i, j, low, high, temp, middle;    for (i = 1; i < length; i++)    {        temp = intArray[i];        low = 0;        high = i - 1;        while (low <= high)        {            middle = (low + high) / 2;            if (temp < intArray[middle])                high = middle - 1;            else                low = middle + 1;        }        if (low != i)        {            for (j = i; j > low; j--)            {                intArray[j] = intArray[j - 1];            }            intArray[low] = temp;        }    }}復(fù)制代碼

以上就是插入排序算法的內(nèi)容。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲三区精品 | 日本不卡一区二区在线观看 | 久久超碰99 | 香蕉秀| 成人免费看视频 | 91丝袜| 日韩视频―中文字幕 | 欧美在线观看视频一区 | 成人黄色小视频在线观看 | 久久精品99北条麻妃 | 欧美一级高潮 | 一区二区三视频 | 国产精品欧美日韩一区二区 | 免费一级a毛片免费观看 | 久久免费视频在线 | 91精品国产777在线观看 | 黄色影院网站 | 性生活视频软件 | 黄色av电影在线播放 | 国产免费黄网 | 特级无码毛片免费视频尤物 | 日韩中文字幕三区 | 国产成人自拍小视频 | 欧美a区| 电影av在线| 国产合集91合集久久日 | 欧美成人午夜一区二区三区 | 成人免费av在线播放 | 一级毛片电影院 | 国产欧美精品一区二区三区四区 | 国内xxxx乱子另类 | 免费人成在线播放 | 欧美一区二区三区免费观看 | 国产成人自拍av | 欧美综合在线观看视频 | 免费在线观看毛片视频 | 久久免费观看一级毛片 | 91香蕉影视 | 亚洲一区二区三区四区精品 | 草逼一区 | 91成人久久|