排序演算法之一 直接插入排序
阿新 • • 發佈:2019-02-01
最近想對一些排序演算法做個總結。當然,這個對絕大多數人來說都是很簡單的,或者說都不想去關心的。對於我來說,雖然寫了些程式,但是基本功一直沒有好好夯實,特此惡補一下。此貼絕非原創,只是自己的一點積累。希望能和大家共勉。例子均以資料結構教材為依照,有些地方做了些修改。
文章其實早就寫好,只是因為開通部落格後三天之內不能發文章,於是耽擱到現在了
直接插入排序,直接插入排序思路比較簡單,就是將待排序陣列的第0個位置作為快取,(這裡不講哨兵,因為本人沒上過資料結構的課,前面的內容也沒看過,就全看自己理解力,如有不對,請多指教!)從第二個元素開始(目的是預設),每次先將新元素放入第0個位置,然後和當前有序序列的最後一個元素進行比較,若大於等於就保持原位不動,若小於就開始向前移動不斷比較直到找到一個小於的位置或者到達位置0為止。
直接插入排序的開銷主要體現在資料的比較和移動次數上,本人數學功底不好,就不討論效能了,直接上程式碼,截圖。
const int iCount = 9; int iRawBuff[iCount] = {0,49,38,65,97,76,13,27,49}; int DirectInsertSort() { for (int i = 2;i < iCount;i++) { iRawBuff[0] = iRawBuff[i]; int j = i-1; while (iRawBuff[0] < iRawBuff[j]) { iRawBuff[j+1] = iRawBuff[j]; j--; } iRawBuff[j+1] = iRawBuff[0]; //std::cout<<"第:"<<(i-1)<<std::endl; printf("第%d趟:\n",i-1); for(int k = 0; k < iCount; k++) { std::cout<<iRawBuff[k]<<"\t"; } std::cout<<std::endl; } return 0; }
今天突然想到,while(iRawBuff[0]<iRawBuff[j])這句應該在加一個限定j是大於等於零的,如果超過了界限,就沒有意義了。
腦子裡突然閃了一下,不用這樣做,為什麼呢?iRawBuff[[0],的值和他相等,所以到了0處還沒滿足的話肯定要跳出迴圈的,哨兵的意義很大程度也在於此了,哈哈 不錯,2b的我今天有收穫