一:插入排序
在一組無序的陣列中,假設第乙個有序,每一次陣列中剩餘的元素與第乙個比較,然後逐個插入到乙個有序的序列中,直到這個陣列所有的數字有序為止;
二:直接插入演算法
演算法思路:
1:我們先假設第乙個有序的數字下標為end,
2:下乙個要插入的數字(tmp)繼續構成有序就直接插入,此時end向後挪一位,
3:繼續插入元素,如果下乙個插入的數字和第乙個不成構成有序,先與前乙個元素交換,然後把end的下標–,直到所有的元素都有序結束。
實現
template
struct less
};template
struct greater
};template
void insertsort(t * _a, size_t n)
else
end -= 1;
}_a[end + 1] = tmp;
}}template
void printsort(t*a, size_t n)
cout
<< endl;
}void testselect()
; int n = sizeof (a) / sizeof(a[0]);
insertsort>(a, n);
printsort(a, n);
}
分析:直接插入排序最壞的時間複雜度o(n^2),也就是將乙個有序的陣列逆序,最好的時間複雜度o(n),就是有序;那麼如何讓插入演算法更加高效呢?
三:希爾排序
希爾排序又稱縮小增量排序,我們可以看成是直接插入排序的改進版本;
,當數字的基數很大時,而且都接近無序,如果用插入演算法乙個個比較後再插入,時間很高,我們可以借助分制的思想,我乙個大的無序陣列,分成若干個小串行列,再進行插入排序這樣就會很快;
演算法思路:
1:首先進行預排序,將大的元素盡快到後面,小的元素盡快到前面
2:然後取間距gap
template
struct less
};template
struct greater
};template
void printsort(t*a, size_t n)
cout
<< endl;
}template
void shellsort(t*_a, size_t n)
else
end -= gap;
}_a[end + gap] = tmp;}}
}void testshellsort()
; int n = sizeof(a) / sizeof(a[0]);
shellsort>(a, n);
printsort(a, n);
}
四:總結:1:直接插入排序:
適合乙個有序的序列。而且範圍不是很大,快速高效,時間複雜度最快o(n)
缺陷:
當序列的範圍很大時,或者逆序時時間複雜度o(n^2)
2:希爾排序:
解決序列的範圍很大時的排序;
分制思想:將大的序列,根據距離分成若干個小的序列;
每個小的序列進行插入排序,當距離為1時,進行直接插入排序。
直接插入排序和希爾排序
if defined insertsort h define insertsort h include define maxsize 100 typedef int keytype 關鍵字型別用來比較 typedef char infotype 其他型別的資訊 typedef structrecty...
直接插入排序和希爾排序
一 直接插入排序 插入排序 1.1 基本思想和原理 將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即 先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。要點 設立哨兵,它有兩個作用 進入查詢 插入位置 迴圈之前,它儲存了r i ...
直接插入排序 和 希爾排序
直接插入排序的思想 include include using namespace std 直接插入排序 9,1,5,8,3,7,4,6,2 void insertsort int arr,int sz else break arr end key void printf int arr,int s...