用C++简单的实现插入和希尔排序,也算是一个笔记吧~
1. 插入排序和希尔排序的原理
2.代码
#include <iostream>
#include <vector>
void Swap(std::vector<int>&, int, int);
// 实现直接插入排序算法
void InsertSort(std::vector<int>& unorder_array) {
for (int i = 1; i < unorder_array.size(); ++i) {
int temp = unorder_array[i]; // 保存中间变量
int j;
for (j = i - 1; j >= 0 && unorder_array[j] > temp; --j) {
unorder_array[j + 1] = unorder_array[j]; // 向后移动哈
}
unorder_array[j + 1] = temp;
}
}
// 希尔排序1:使用交换方法。分组进行插入排序,交换法使用希尔增量[length/2, length/4,...]
void ShellSortSwap(std::vector<int>& unorder_array) {
for (int gap = unorder_array.size() >> 1; gap > 0; gap = gap >> 1) { // 注意这里的for的第三个参数是一个表达式是gap = gap >> 1,而不是直接是gap >> 1
for (int i = gap; i < unorder_array.size(); ++i) {
int j = i;
while (j - gap >= 0 && unorder_array[j] < unorder_array[j - gap]) {
Swap(unorder_array, j, j - gap);
j = j - gap;
}
}
}
}
//希尔排序2:使用移动方法。
void ShellSortMove(std::vector<int>& unorder_array) {
for (int gap = unorder_array.size() >> 1; gap > 0; gap = gap >> 1) {
for (int i = gap; i < unorder_array.size(); ++i) {
if (unorder_array[i] < unorder_array[i - gap]) { // 在希尔排序的内部使用直接插入排序
int temp = unorder_array[i]; // 保存当前需要插入的数据
int k = i - gap; // 当前需要插入之前一个元素
while (k >=0 && temp < unorder_array[k]) {
unorder_array[k + gap] = unorder_array[k];
k = k - gap;
}
unorder_array[k + gap] = temp; // 插入数据
}
}
}
}
// 交换二个变量
void Swap(std::vector<int>& unorder_array, int a, int b) { // 交换数据,不使用中间变量
unorder_array[a] = unorder_array[a] + unorder_array[b]; // 注意这里是unorder_array[b]而不是b
unorder_array[b] = unorder_array[a] - unorder_array[b];
unorder_array[a] = unorder_array[a] - unorder_array[b];
}
int main()
{
std::vector<int> unorder_array;
int data;
std::cin >> data;
unorder_array.push_back(data);
while (std::cin.get() != '\n') {
std::cin >> data;
unorder_array.push_back(data);
}
std::cout << "orgin seq is: ";
for (auto it = unorder_array.begin(); it != unorder_array.end(); ++it) {
std::cout << *it << " ";
}
std::cout << "\n";
ShellSortSwap(unorder_array); // 这里可以选择InsertSort or ShellSortSwap or ShellSortMove
std::cout << "insert sort is: ";
for (int i = 0; i < unorder_array.size(); ++i) {
std::cout << unorder_array[i] << " ";
}
return 0;
}
只是用来放代码的,以后可以找的到。