您的位置:首页 > 编程语言 > C语言/C++

算法导论第二章-算法基础-Cpp代码实现

2016-06-08 12:16 393 查看
强迫症晚期患者,为了完整性补上前面几章的代码。

这里比较简单,实现一个in-place的插入排序和in-place的归并排序。

basic_sort.h

#pragma once

/*************************************************
Author:董小歪
Date:2016-06-08
Description:算法导论第二章-算法基础-Cpp代码实现
**************************************************/

#ifndef BASIC_SORT_H
#define BASIC_SORT_H

#include <iostream>
#include <vector>

using namespace std;

class Basic_Sort
{
public:
template <typename T> void insertion_sort(vector<T> &data); //插入排序
template <typename T> void merge_sort(vector<T> &data); //归并排序~分治
template <typename T> void pirnt_data(const vector<T> &data); //打印数据

private:
template <typename T> void merge_sort(vector<T> &data, int l, int r); //归并
template <typename T> void merge(vector<T> &data, int l, int m, int r); //合并两个排序数组
};

template <typename T>
void Basic_Sort::insertion_sort(vector<T> &data)
{
for (int j = 1; j < data.size(); ++j)
{
T key = data[j];
int i = j - 1;
while (i >= 0 && data[i] > key)
{
data[i + 1] = data[i];
--i;
}
data[i + 1] = key;
}
}

template <typename T>
void Basic_Sort::merge_sort(vector<T> &data)
{
if (data.size() < 2)
return;
merge_sort(data, 0, data.size() - 1);
}

template <typename T>
void Basic_Sort::merge_sort(vector<T> &data, int l, int r)
{
if (l < r)
{
int m = l + (r - l) / 2;
merge_sort(data, l, m);
merge_sort(data, m + 1, r);
merge(data, l, m, r);
}
}

template <typename T>
void Basic_Sort::pirnt_data(const vector<T> &data)
{
for (auto const var : data)
cout << var << " ";
cout << endl;
}

template <typename T>
void Basic_Sort::merge(vector<T> &data, int l, int m, int r)
{
vector<T> vec1, vec2;
for (int i = l; i <= m; ++i)
vec1.push_back(data[i]);
for (int i = m + 1; i <= r; ++i)
vec2.push_back(data[i]);
vec1.push_back(INT_MAX);
vec2.push_back(INT_MAX);
int i = 0, j = 0;
for (int k = l; k <= r; ++k)
{
if (vec1[i] < vec2[j])
data[k] = vec1[i++];
else
data[k] = vec2[j++];
}
}

#endif // !BASIC_SORT_H


测试:
main_entrance.cpp

#include "basic_sort.h"

int main()
{
Basic_Sort bs;
vector<int> data1 = { 5,2,4,6,1,3 };
vector<int> data2 = { 2,4,5,7,1,2,3,6 };
cout << "原数组:";
bs.pirnt_data(data1);
bs.insertion_sort(data1);
cout << endl << "插入排序后:";
bs.pirnt_data(data1);

cout << endl << "原数组:";
bs.pirnt_data(data2);
bs.merge_sort(data2);
cout << endl << "插入排序后:";
bs.pirnt_data(data2);

system("pause");
}

测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息