插入排序
**說起排序算法,最先要說的就是插入排序。**因爲它簡單且穩定。
那麼什麼是插入排序呢?
例如:
- 有一組數據已經有序(不論升序降序)的排列好了,這時候我們需要在這組數據中再插入一個數據,並且要求該組數據依然有序,那麼這個時候我們就可以使用插入排序算法解決問題。
- 算法思想(我們以數組的操作舉例(升序)):
1.首先,包含兩個以上元素的數組才需要排序。所以我們就從數組的第二個元素開始。
2.將我們選擇出來的元素與它左邊的元素依次比較,如果左邊第一個元素比它大,則比較左邊第二個,直到遇到比他小的,就插到這個元素的右邊。
3.然後就這樣往後選取元素重複上面的步驟。 - 當然,如果你看上面的文字覺得乾巴巴的有點晦澀,看不懂是個什麼玩意兒。博主還爲你準備了下面的代碼示例,希望兩者對比着看可以對你有所幫助。
代碼示例如下(C#實現):
//定義一個整型數組
int[] arr01 = new int[] { 5, 6, 4, 1, 3, 8, 9, 0, 2, 7 };
//第一種方式
//我們定義一個變量temp用來交換值
int temp01;
//從角標1也就是第二個元素開始
for (int i = 1; i < arr01.Length; i++)
{
//將我們選擇出來的元素與它左邊的元素依次比較
for (int j = i; j > 0; j--)
{
//滿足條件就交換兩數位置
if (arr01[j] < arr01[j - 1])
{
temp01 = arr01[j];
arr01[j] = arr01[j - 1];
arr01[j - 1] = temp01;
}
}
}
//打印看看是否正確
Console.WriteLine("排序後的數組爲:");
for (int i = 0; i < arr01.Length; i++)
{
Console.Write(arr01[i] + " ");
}
好,上面這種方法能夠實現我們的插入排序,可是我們可以看到,每次判斷爲真之後都要進行兩數交換,這一操作過於頻繁。下面我們就針對這裏進行優化,請看第二種實現方法:
代碼示例如下(C#實現):
//定義一個整型數組
int[] arr01 = new int[] { 5, 6, 4, 1, 3, 8, 9, 0, 2, 7 };
//第二種方式
//從角標1也就是第二個元素開始
for (int i = 1; i < arr01.Length; i++)
{
//進入第一層循環,我們先定義兩個變量temp,index
//temp用來保存我們選擇進行插入排序的元素的值
//index用來保存要插入的角標位置
int temp = arr01[i];
int index = i;
//將我們選擇出來的元素與它左邊的元素依次比較
for (int j = i; j > 0; j--)
{
//滿足條件就先變更角標和後移比較過的元素的值
if (temp < arr01[j - 1])
{
arr01[j] = arr01[j - 1];
index = j-1;
}
}
//在合適的位置插入我們選擇的值
arr01[index] = temp;
}
//打印看看是否正確
Console.WriteLine("排序後的數組爲:");
for (int i = 0; i < arr01.Length; i++)
{
Console.Write(arr01[i] + " ");
}
好啦,上面這個就是優化版本了,可以看到我們省去了很多次交換的步驟,優化了代碼。