在基礎薄弱的時候即便是寫一些簡單的題也受益良多。
這是《演算法導論》第二章第一節所舉的全書第乙個例子。
為了跟上時代的步伐以及讓**看起來更c++些
,以後我會用
cin、
cout
替代printf
、scanf
,用stl
抽象容器替代陣列、鍊錶,用迭代器替代指標等。
但同時出於練基本功的考慮,盡量先不直接使用演算法庫提供的高階操作。
第乙份**是我憑印象自己實現的,定義了兩個list,操作起來比較直觀方便。
第二份是對照著書中提供的偽碼實現的,只用了乙個list,當然由於i最好不要超越begin(),對i到達first的情況作了單獨處理。
因為找不到那種online judge system對**作測試,所以無法保證不存在漏洞,個人測試結果暫時是都通過了,期間收穫都總結在注釋中。
insertion_sort_1.cpp
/*
2013.8.3
1,輸入任意長度的整形數列
2,用普通插入法排序
3,輸出結果
*/#include #include using namespace std;
void insertion_sort( list&a,list&b)
}if (iter_b == b.end())
}}int main()
insertion_sort( list_a, list_b);
cout<<"the sorted array is:";
for (list::iterator iter = list_b.begin(); iter != list_b.end(); ++iter)
cout<<(*iter)<<" ";}/*
一般知識點:
1,>> 會過濾掉掉不可見字元如空格、回車、tab等,所以輸入數字時這些鍵都起間隔作用。
2,使用istream物件作測試條件,結果是測試流的狀態。輸入有效則成功,遇到檔案結束符或無效輸入則失敗。
3,將容器作為函式引數,一般通過迭代器傳遞。
4,要支援插入操作,明顯應選用list容器。
5,注意向函式中傳遞容器時,要按引用傳遞。
6,函式形參最好不要與外部定義的實參取同名。
坑點:1,erase、pop_front、pop_back使指向被刪元素的迭代器失效,所以一定要先移動迭代器,再刪除元素。
*/
insertion_sort_2.cpp
/*
2013.8.3
1,輸入任意長度的整形數列
2,用普通插入法排序
3,輸出結果
4,採用《演算法導論》給出的偽**思路
*/#include #include using namespace std;
void insertion_sort( list&a)
if( i == a.begin())
else
*(++i) = key;
} else
*(++i) = key; }}
int main()
insertion_sort( list_a);
cout<<"the sorted array is:";
for( list::iterator iter = list_a.begin(); iter != list_a.end(); ++iter)
cout<<(*iter)<<" ";}/*
一般知識點:
1,list容器的iter僅支援iter++等,不支援iter+n,即便n = 1也不行。
坑點:1,自增運算++放在前面返回修改後的值,而放在後面返回原來的值。比如*(++i) = key;等同於i++; *i = key; 而*(i++) = key等同於*i = key; i++;如此則出錯。
養成只在必要時使用後置操作符的習慣,因為++i效能更優且適用於大多數情況。
*/
插入排序 折半插入排序
折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...
插入排序 折半插入排序
折半插入排序是基於直接插入排序的優化。直接插入排序 將第i個元素插入時,通過折半查詢的方式,來查詢第i個元素合適的位置。當0 i 1 位置上的元素都已經排序ok,現需要插入第i個元素,設其值為temp 令low 0,high i,mid high low 2。那麼temp可能插入的位置是 low h...
插入排序 希爾插入排序
本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...