資料結構與演算法——插入排序以及C++函式模板實現

readyao發表於2016-01-06

插入排序思路就是:(採用從小到大排序,從大到小排序意思一樣)

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;
}

相關文章