言數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)筆記:數(shù)組與插入排序)
前言本文面向編程零基礎(chǔ)小白用生活化案例通俗講解C語(yǔ)言中數(shù)組核心概念、組成要素與完整實(shí)操流程手把手演示插入排序的完整可運(yùn)行代碼示例。一、核心概念數(shù)組數(shù)組是一種數(shù)據(jù)結(jié)構(gòu)本質(zhì)上是一串連續(xù)的內(nèi)存。一般在需要存大量同類(lèi)型數(shù)據(jù)時(shí)會(huì)考慮使用數(shù)組。常用的有兩種方式定義數(shù)組可以根據(jù)情況靈活選用//以整型數(shù)組為例//還未放入內(nèi)容但規(guī)定了大小intarr[10];//直接放入內(nèi)容intarr[]{0,1,2,3,4,5};數(shù)組的每個(gè)位置都可以放入一個(gè)數(shù)據(jù)可以放入的數(shù)據(jù)類(lèi)型與定義時(shí)聲明的數(shù)據(jù)類(lèi)型相同比如 int整型數(shù)組就只能存整型數(shù)據(jù)double浮點(diǎn)型數(shù)組就只能存浮點(diǎn)型數(shù)據(jù)。存數(shù)據(jù)與取數(shù)據(jù)的操作本質(zhì)上是給指定的下標(biāo)位置賦值或反過(guò)來(lái)用指定下標(biāo)位置的數(shù)據(jù)為變量賦值具體操作如下//存數(shù)據(jù)//定義一個(gè)長(zhǎng)度為5的數(shù)組intarr[5];//為下標(biāo)為2的位置賦值“10”arr[2]10;//取數(shù)據(jù)//定義一個(gè)數(shù)組并放入一些內(nèi)容intarr[]{5,10,20,40};//取下標(biāo)為1的位置的數(shù)據(jù)intiarr[1];在C語(yǔ)言中數(shù)組在規(guī)定大小但未進(jìn)行賦值之前每個(gè)位置是沒(méi)有默認(rèn)值的有的只是毫無(wú)規(guī)律的垃圾數(shù)據(jù)。如果是在Java 中數(shù)組是有默認(rèn)值的整型數(shù)組的默認(rèn)值為0可以打印一個(gè)沒(méi)有賦值的數(shù)組試試#includestdio.hintmain(){inti[10];for(intj0;j10;j){printf(%d ,i[j]);}return0;}輸出結(jié)果可能會(huì)是16 0 -1599138551 32759 0 0 43 0 -945482800 373像這樣毫無(wú)規(guī)律的垃圾數(shù)據(jù)。不過(guò)通過(guò)這個(gè)操作int arr[10] {0}; 就可以讓數(shù)組每一個(gè)位置的默認(rèn)值為0當(dāng)然也可以根據(jù)需求換成其他的默認(rèn)值。二、什么是插入排序面對(duì)一個(gè)內(nèi)容無(wú)序的整型數(shù)組比如內(nèi)容是“25413”的數(shù)組要將其排序成數(shù)字由小到大的數(shù)組有幾種不同的方式常用的簡(jiǎn)單排序方法有比如“冒泡排序”、“選擇排序”、“插入排序”等方法這次講解的是插入排序法。插入排序的思路是選擇一個(gè)位置一般從數(shù)組第二個(gè)位置開(kāi)始成為“key”將 key 之前的所有位置視為已經(jīng)排序完成的有序狀態(tài)依次將 key 與上一個(gè)位置的數(shù)據(jù)比較就這樣一直比較到第一個(gè)位置。每次比較時(shí)如果上一個(gè)數(shù)據(jù)比 key 大就把上一個(gè)數(shù)據(jù)往后挪一格。如果上一個(gè)數(shù)據(jù)比 key 小那么不論是否遍歷到第一個(gè)位置都停止繼續(xù)遍歷 key 插入這個(gè)位置。如果和 key 相等就停止遍歷把 key 插在這個(gè)相等數(shù)據(jù)的后一位這樣相對(duì)順序也不會(huì)亂。如果遍歷到頭了仍然沒(méi)有比 key 小的數(shù)據(jù)那么 key 就插入進(jìn)第一格。比較完一個(gè) key 之后就讓 key 原來(lái)所在位置的后一位成為新的 key然后再開(kāi)啟新一輪遍歷比較。實(shí)際上就像這樣2 5 4 1 3從第二格也就是“5”開(kāi)始。5成為 key254 1 325留在原地2541 34成為 key和上一格比較2451 354所以將5往后挪一位2451 324所以4插入2與5之間1成為 key和上一格比較245135124153412145321)12453最后1插入2之前3成為 key和上一格比較12453……1 2 3 4 5排序結(jié)束最后數(shù)組就被排序成由小到大的順序了三、完整實(shí)操案例#includestdio.hintmain(){//定義數(shù)組intarr[5]{0};//循環(huán)執(zhí)行輸入的操作循環(huán)次數(shù)是數(shù)組的長(zhǎng)度f(wàn)or(inti0;i5;i){scanf(%d,arr[i]);}//外循環(huán)從數(shù)組第二格開(kāi)始遍歷數(shù)組for(inti1;i5;i){//定義一個(gè)變量 key 和變量 j 用來(lái)比較//key 從數(shù)組的第二個(gè)位置開(kāi)始取每次外循環(huán)往后一格intkeyarr[i];intji-1;//內(nèi)循環(huán)只要 j 不小于0且 j 下標(biāo)處的數(shù)字大于 key就把它往后移一格//接著每次內(nèi)循環(huán) j 再往前移一格while(j0arr[j]key){arr[j1]arr[j];j--;}//循環(huán)的最后讓比較結(jié)束后的空位獲得 key 的值arr[j1]key;}//用循環(huán)遍歷數(shù)組并輸出for(inti0;i5;i){printf(%d ,arr[i]);}//換行保持工整printf(\n);return0;}四、個(gè)人收獲總結(jié)在寫(xiě)這次代碼時(shí)我是結(jié)合還記得的課上聽(tīng)到的內(nèi)容以及查到的一些資料在編寫(xiě)。寫(xiě)的時(shí)候?qū)τ谶@種排序方法的原理其實(shí)并沒(méi)有很清晰而是有點(diǎn)那種“似懂非懂”的感覺(jué)大概明白了怎么寫(xiě)至于最后是怎么運(yùn)作的在大腦中嘗試模擬也感覺(jué)有點(diǎn)云里霧里的。最后代碼寫(xiě)完了試運(yùn)行后功能也完好無(wú)誤原理也大概清楚但具體是什么樣的過(guò)程我也說(shuō)不清。最后我自己梳理了一遍就是前面我在“什么是插入排序”部分中寫(xiě)到的過(guò)程。雖然這并不是一個(gè)什么很復(fù)雜的東西但梳理出來(lái)后感覺(jué)大腦無(wú)比的清晰。這雖然只是一個(gè)小小的進(jìn)步與發(fā)現(xiàn)卻也是寫(xiě)技術(shù)筆記意義的一部分。