欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言深入淺出講解直接插入排序算法的實現(xiàn)

 更新時間:2022年05月18日 10:53:02   作者:安然無虞  
插入排序也是最簡單的一類排序方法,我今天介紹的也是插入排序里最直觀且淺顯易懂的直接插入排序。對這個很簡單的排序,記得當時也是花了近兩個晚上才搞懂它的原理的,接下來就來介紹一下

插入排序分為兩種:直接插入排序&希爾排序

直接插入排序

1.基本思想

直接插入排序是一種簡單的插入排序算法,其基本思想是:

把待排序的記錄按其關(guān)鍵碼值的大小逐個插入到一個已經(jīng)排好序的有序序列中,直到所有的記錄插入完為止,得到一個新的有序序列 。

說得通俗一點就是:

假設區(qū)間[0, end]有序,將end+1位置的值插入到[0, end]中,保持區(qū)間[0, end+1]依舊有序。

生活中我們玩撲克牌時,就用了插入排序的思想。

在這里,我們以排升序為例。

核心思想:摸牌的過程

動圖演示:

2.算法實現(xiàn)

寫排序時,先從單趟開始考慮

//[0, end]已經(jīng)有序,將end+1位置的值插入到[0,end]中,使得[0,end+1]依舊保持有序
//有一個有序區(qū)間,插入一個數(shù)據(jù),依舊保持有序
void InsertSort(int* a, int n)
{
	for (int i = 0; i < n - 1; i++)
	//控制摸牌的過程,一開始從僅一張開始
	//注意循環(huán)結(jié)束條件,只需要到n-2的位置,若將其改成i<n,則會出現(xiàn)越界的情況
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)//保證牌是有序的
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];//往后挪,注意畫圖感受哦
				end--;
			}
			else
			//有兩種可能:(現(xiàn)想常規(guī)的,再考慮特殊情況)
			//一是找到了比它小的數(shù),放到其后;
			//二是沒有比它小的數(shù),直到end為-1才結(jié)束
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

完整代碼:

3.時間復雜度

直接插入排序時間復雜度是O(N^2),注意哦,不是因為雙重循環(huán),需要實際計算來得出時間復雜度。

最壞情況:逆序有序,1+2+3+……+n - 1;O(N^2)

最好情況:順序有序,1+1+1+……+1。O(N)

到此這篇關(guān)于C語言深入淺出講解直接插入排序算法的實現(xiàn)的文章就介紹到這了,更多相關(guān)C語言直接插入排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 用C++實現(xiàn)DBSCAN聚類算法

    用C++實現(xiàn)DBSCAN聚類算法

    本篇文章是對使用C++實現(xiàn)DBSCAN聚類算法的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言break和continue的語句用法

    C語言break和continue的語句用法

    這篇文章主要介紹了C語言break和continue的語句用法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • C語言編程使用MATLAB繪制橢圓及圓角矩形

    C語言編程使用MATLAB繪制橢圓及圓角矩形

    這篇文章主要為大家介紹了C語言編程中使用MATLAB繪制橢圓及圓角矩形的實現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • 淺析結(jié)束程序函數(shù)exit, _exit,atexit的區(qū)別

    淺析結(jié)束程序函數(shù)exit, _exit,atexit的區(qū)別

    在一個程序中最多可以用atexit()注冊32個處理函數(shù),這些處理函數(shù)的調(diào)用順序與其注冊的順序相反,也即最先注冊的最后調(diào)用,最后注冊的最先調(diào)用
    2013-09-09
  • C/C++編程語言中的指針(pointer)你了解嗎

    C/C++編程語言中的指針(pointer)你了解嗎

    這篇文章主要為大家詳細介紹了C/C++編程語言中的指針,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++數(shù)據(jù)結(jié)構(gòu)深入探究棧與隊列

    C++數(shù)據(jù)結(jié)構(gòu)深入探究棧與隊列

    棧和隊列,嚴格意義上來說,也屬于線性表,因為它們也都用于存儲邏輯關(guān)系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,本章講解分別用隊列實現(xiàn)棧與用棧實現(xiàn)隊列
    2022-05-05
  • 淺析C++中cout的運行機制

    淺析C++中cout的運行機制

    關(guān)于C++中cout的使用,相信大家再熟悉不過了,然而對于cout是如何輸出的?輸出的機制是啥,需要進一步的了解。本章娓娓道來。前幾天在網(wǎng)上看到這么一個題目
    2013-10-10
  • C++二叉樹的直徑與合并詳解

    C++二叉樹的直徑與合并詳解

    這篇文章主要為大家詳細介紹了C++實現(xiàn)二叉樹基本操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • C++實現(xiàn)LeetCode(104.二叉樹的最大深度)

    C++實現(xiàn)LeetCode(104.二叉樹的最大深度)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(104.二叉樹的最大深度),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++實現(xiàn)LeetCode(2.兩個數(shù)字相加)

    C++實現(xiàn)LeetCode(2.兩個數(shù)字相加)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(兩個數(shù)字相加),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論