資料結構與演算法——插入排序以及C++函式模板實現
插入排序思路就是:(採用從小到大排序,從大到小排序意思一樣)
1:直接插入第一個元素。2:再插入第二個元素,並將第二個元素與之前的元素比較,如果比之前的元素小,則之前的元素向後移動一個位置。
3:再插入第三個元素,並將第三個元素與之前的元素比較,如果比之前的元素小,則之前的元素向後移動一個位置,直到比較到大於某個元素或到最前面的元素的位置為止。
例項1:簡單實現,預設從小到大排序
/*************************************************************************
> File Name: insert_sort.cpp
> Author:
> Mail:
> Created Time: 2016年01月06日 星期三 22時31分28秒
************************************************************************/
#include <iostream>
#include <vector>
using namespace std;
void input_data(vector<int> & data)
{
cout << "輸入的資料序列:";
int tmp;
while(cin >> tmp){
data.push_back(tmp);
}
}
void insert_sort(vector<int> & data)
{
int j;
for (int i = 1; i < data.size(); ++i){
int tmp = data[i];
for (j = i; j > 0 && tmp < data[j-1]; j--){
data[j] = data[j-1];
}
data[j] = tmp;
}
}
void output_data(vector<int> & data)
{
cout << "排序的資料序列:";
for (int i = 0; i < data.size(); ++i){
cout << data[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> data;
input_data(data);
insert_sort(data);
output_data(data);
return 0;
}
例項2:實現插入排序函式模板,預設是從小到大,不提供可選的排序順序。
/*************************************************************************
> File Name: insert_sort.cpp
> Author:
> Mail:
> Created Time: 2016年01月06日 星期三 22時31分28秒
************************************************************************/
#include <iostream>
#include <vector>
#include <string>
using namespace std;
template<class Obj>
void input_data(vector<Obj> & data)
{
cout << "輸入的資料序列:";
Obj tmp;
while(cin >> tmp){
data.push_back(tmp);
}
}
template<class Iterator, class Obj>
void insert_sort_help(const Iterator & begin, const Iterator & end, const Obj & obj)
{
Iterator j;
for (Iterator i = begin+1; i != end; ++i){
Obj tmp = *i;
for (j = i; j != begin && tmp < *(j-1); j--){
*j = *(j-1);
}
*j = tmp;
}
}
template<class Iterator>
void insert_sort(const Iterator & begin, const Iterator & end)
{
/*
int j;
for (int i = 1; i < data.size(); ++i){
int tmp = data[i];
for (j = i; j > 0 && tmp < data[j-1]; j--){
data[j] = data[j-1];
}
data[j] = tmp;
}*/
insert_sort_help(begin, end, *begin);
}
template<class Iterator>
void output_data(const Iterator & begin, const Iterator & end)
{
cout << "排序的資料序列:";
for (Iterator it = begin; it != end; ++it){
cout << *it << " ";
}
cout << endl;
}
int main()
{
/*
vector<int> data;
input_data(data);
insert_sort(data.begin(), data.end());
output_data(data.begin(), data.end());
*/
vector<string> str_data;
input_data(str_data);
insert_sort(str_data.begin(), str_data.end());
output_data(str_data.begin(), str_data.end());
return 0;
}
例項3:實現插入排序函式模板,提供可選的排序順序。
/*************************************************************************
> File Name: insert_sort.cpp
> Author:
> Mail:
> Created Time: 2016年01月06日 星期三 22時31分28秒
************************************************************************/
#include <iostream>
#include <vector>
#include <string>
#include <functional>
using namespace std;
template<class Obj>
void input_data(vector<Obj> & data)
{
cout << "輸入的資料序列:";
Obj tmp;
while(cin >> tmp){
data.push_back(tmp);
}
}
template<class Iterator, class Obj, class Comparator>
void insert_sort_help(const Iterator & begin, const Iterator & end, const Obj & obj, const Comparator &comp)
{
Iterator j;
for (Iterator i = begin+1; i != end; ++i){
Obj tmp = *i;
//for (j = i; j != begin && tmp < *(j-1); j--){
for (j = i; j != begin && comp(tmp, *(j-1)); j--){
*j = *(j-1);
}
*j = tmp;
}
}
template<class Iterator, class Comparator>
void insert_sort(const Iterator & begin, const Iterator & end, const Comparator & comp)
{
/*
int j;
for (int i = 1; i < data.size(); ++i){
int tmp = data[i];
for (j = i; j > 0 && tmp < data[j-1]; j--){
data[j] = data[j-1];
}
data[j] = tmp;
}*/
insert_sort_help(begin, end, *begin, comp);
}
template<class Iterator>
void output_data(const Iterator & begin, const Iterator & end)
{
cout << "排序的資料序列:";
for (Iterator it = begin; it != end; ++it){
cout << *it << " ";
}
cout << endl;
}
int main()
{
#if 1
vector<int> data;
input_data(data);
cout << "從小到大排序,";
insert_sort(data.begin(), data.end(), less<int> ());//從小到大排序
output_data(data.begin(), data.end());
cout << "從大到小排序,";
insert_sort(data.begin(), data.end(), greater<int> ());//從大到小排序
output_data(data.begin(), data.end());
#else
vector<string> str_data;
input_data(str_data);
cout << "從小到大排序,";
insert_sort(str_data.begin(), str_data.end(), less<string> ());//從小到大排序
output_data(str_data.begin(), str_data.end());
cout << "從大到小排序,";
insert_sort(str_data.begin(), str_data.end(), greater<string> ());//從大到小排序
output_data(str_data.begin(), str_data.end());
#endif
return 0;
}
相關文章
- 資料結構與演算法——B樹的C++實現資料結構演算法C++
- 資料結構&演算法實踐—插入排序資料結構演算法排序
- 資料結構與演算法——AVL樹類的C++實現資料結構演算法C++
- 資料結構與演算法——普通樹的定義與C++實現資料結構演算法C++
- [資料結構與演算法]-排序演算法之插入排序(insertion sort)及其實現(Java)資料結構演算法排序Java
- python演算法與資料結構-插入排序(34)Python演算法資料結構排序
- 資料結構與演算法——表示式樹類的C++實現(二叉樹)資料結構演算法C++二叉樹
- 資料結構與演算法——不相交集類的C++實現資料結構演算法C++
- 迴圈單連結串列建構函式、解構函式C++實現函式C++
- C++模板函式實現型別推導C++函式型別
- 資料結構與演算法——無權最短路徑演算法的C++實現資料結構演算法C++
- 資料結構與演算法——最短路徑Dijkstra演算法的C++實現資料結構演算法C++
- 資料結構與演算法——常用高階資料結構及其Java實現資料結構演算法Java
- 演算法與資料結構-棧(Stack)-Java實現演算法資料結構Java
- c++函式模板C++函式
- 【資料結構與演算法】快速排序(三種程式碼實現以及工程優化)資料結構演算法排序優化
- 演算法與資料結構系列 ( 四 ) - 插入排序法- Insert Sort演算法資料結構排序
- 資料結構與演算法——二叉查詢樹類的C++實現資料結構演算法C++
- 資料結構 - 單連結串列 C++ 實現資料結構C++
- 【資料結構】實現單連結串列(c++)資料結構C++
- 演算法與資料結構——選擇排序(c++)演算法資料結構排序C++
- 【資料結構】實現順序表(c++)資料結構C++
- 『資料結構與演算法』棧:詳解與程式碼實現資料結構演算法
- 資料結構與演算法——圖的鄰接表表示法類的C++實現資料結構演算法C++
- 資料結構與演算法——有向無環圖的拓撲排序C++實現資料結構演算法排序C++
- 資料結構——單連結串列的C++實現資料結構C++
- 【資料結構】實現迴圈連結串列(c++)資料結構C++
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 資料結構學習(C++)續——排序【2】插入排序 (轉)資料結構C++排序
- 【資料結構與演算法】Trie(字首樹)模板和例題資料結構演算法
- 資料結構模板資料結構
- 模板 - 資料結構資料結構
- 【模板】資料結構資料結構
- 資料結構與演算法——雜湊表類的C++實現(分離連結雜湊表)資料結構演算法C++
- 資料結構與演算法系列(一)陣列實現資料結構演算法陣列
- 資料結構與演算法 | 棧的實現及應用資料結構演算法
- C++的函式和模板函式 (轉)C++函式
- 資料結構學習(C++)——單連結串列(定義與實現) (轉)資料結構C++