插入排序
后期考虑使用模板
示意图
如上图所示,每次都将一个数组右侧无序部分的第一个,插入到左边有序的部分。插入的过程是在有序部分从右向左,不断交换位置。
代码
#include <iostream>
using namespace std;
int* sort_num(int arr[], int n);
void insertion_sort()
{
int list[] = { 34,8,64,51,32,21 };
int len = 6;
int* p;
p = sort_num(list, len);
for (int i = 0; i < len; i++) {
cout << *(p + i) << " ";
}
cout << endl;
}
int* sort_num(int arr[], int n)
{
// 插入排序
int num = 0;
int idx = 1;
for (; idx < n; idx++)
{
for (int j = idx; j > 0; j--)
{
if (arr[j] < arr[j - 1]) { // 这里的判断,可以放在for循环的中止条件中
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
}
else
{
// 当arr[j] >= arr[j - 1]时,就可以结束for循环了
break;
}
num++;
}
}
cout << "idx: " << idx << endl;
cout << "排序执行了多少次:" << num << endl;
return arr;
}
模板方法实现
#include <iostream>
#include "../head_file/template_head.h"
#include <vector>
using namespace std;
void insertion_sort_with_template()
{
cout << "Insertion Sort With Template!!!" << endl;
vector<int> list = { 34,8,64,51,32,21 };
insertionSort(list.begin(), list.end());
for (auto x : list) {
cout << x << " ";
}
cout << endl;
}
template <typename Iterator>
void insertionSort(const Iterator& begin, const Iterator& end)
{
insertionSort(begin, end, less_<decltype(*begin)>{});
}
template <typename Iterator, typename Comparator>
void insertionSort(const Iterator& begin, const Iterator& end, Comparator lessThan)
{
if (begin == end)
return;
Iterator j;
for (Iterator i = begin + 1; i != end; i++) {
auto tmp = std::move(*i);
for (j = i; j != begin && lessThan(tmp, *(j - 1)); j--) {
*j = std::move(*(j - 1));
}
*j = std::move(tmp);
}
}