C語言深入淺出講解直接插入排序算法的實現(xiàn)
插入排序分為兩種:直接插入排序&希爾排序
直接插入排序
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)文章
淺析結(jié)束程序函數(shù)exit, _exit,atexit的區(qū)別
在一個程序中最多可以用atexit()注冊32個處理函數(shù),這些處理函數(shù)的調(diào)用順序與其注冊的順序相反,也即最先注冊的最后調(diào)用,最后注冊的最先調(diào)用2013-09-09C++數(shù)據(jù)結(jié)構(gòu)深入探究棧與隊列
棧和隊列,嚴格意義上來說,也屬于線性表,因為它們也都用于存儲邏輯關(guān)系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,本章講解分別用隊列實現(xiàn)棧與用棧實現(xiàn)隊列2022-05-05C++實現(xiàn)LeetCode(104.二叉樹的最大深度)
這篇文章主要介紹了C++實現(xiàn)LeetCode(104.二叉樹的最大深度),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07C++實現(xiàn)LeetCode(2.兩個數(shù)字相加)
這篇文章主要介紹了C++實現(xiàn)LeetCode(兩個數(shù)字相加),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07