数据结构(七)排序---直接插入排序(稳定)
生活随笔
收集整理的這篇文章主要介紹了
数据结构(七)排序---直接插入排序(稳定)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
經(jīng)典排序算法----直接插入排序算法及其改進(jìn)(穩(wěn)定)
定義:
直接插入排序的基本操作是將一個(gè)記錄插入到已經(jīng)排好序的有序表中,從而得到一個(gè)新的,記錄數(shù)加一的有序表。實(shí)現(xiàn)思想
我們預(yù)留了一個(gè)哨兵,這里我們將用到它來(lái)保存一個(gè)臨時(shí)值 插入排序是在一個(gè)已經(jīng)有序的小序列的基礎(chǔ)上,一次插入一個(gè)元素。當(dāng)然,剛開(kāi)始這個(gè)有序的小序列只有1個(gè)元素,就是第一個(gè)元素。比較是從有序序列的末尾開(kāi)始,也就是想要插入的元素和已經(jīng)有序的最大者開(kāi)始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見(jiàn)一個(gè)和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。 所以,相等元素的前后順序沒(méi)有改變,從原無(wú)序序列出去的順序就是排好序后的順序,所以插入排序是穩(wěn)定的。基本思想
每次將一個(gè)待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子序列中的適當(dāng)位置,直到全部記錄插入完成為止。代碼實(shí)現(xiàn)
void InsertSort(SqList *L) {int i, j, count1, count2;count2 = count1 = 0;for (i = 2; i <= L->length;i++){if (L->r[i]<L->r[i-1]) //若是前面第一個(gè)都不滿足順序,那么我們就要去循環(huán) {L->r[0] = L->r[i];for (j = i - 1; L->r[j]>L->r[0]; j--) //將大的數(shù)據(jù)全部向后移動(dòng),從后向前防止數(shù)據(jù)覆蓋 {count1++;L->r[j + 1] = L->r[j]; //記錄后移 }L->r[j + 1] = L->r[0]; //插入到正確位置count2++;}}printf("loop move count:%d, swap insert count:%d\n", count1, count2); }性能分析
空間上只需要一個(gè)記錄輔助空間,所以關(guān)鍵看時(shí)間復(fù)雜度 平均比較和移動(dòng)次數(shù)約為(n^2)/4,所以時(shí)間復(fù)雜度為O(n^2)。 其性能要比冒泡和簡(jiǎn)單選擇排序好些?
轉(zhuǎn)載于:https://www.cnblogs.com/ssyfj/p/9510735.html
總結(jié)
以上是生活随笔為你收集整理的数据结构(七)排序---直接插入排序(稳定)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: sqlx使用说明
- 下一篇: [cdq分治][树状数组] Jzoj P