插入排序(insertionSort)
基本思想
8 6 2 3 – 6 8 2 3 – 6 2 8 3 – 2 6 8 3 …
代码实现:
#include<iostream>
using namespace std;
template <typename T>
void insertionSort(T arr[],int n) {
for (int i = 1; i < n; i++) {
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j-1])
swap(arr[j-1], arr[j]);
else
break;
}
}
}
int main() {
int a[3] = {2,1,5};
insertionSort(a,3);
for (int i = 0; i < 3; i++)
cout << a[i] << endl;
}
运行结果:
1 2 5
计算算法运行时间
//计算算法运行时间
template <typename T>
void testSort(const string& sortName, void(*sort)(T[], int), T arr[], int n) {
clock_t startTime = clock();
sort(arr, n);
clock_t endTime = clock();
cout << "time="<<double(endTime - startTime)/CLOCKS_PER_SEC << endl;
assert(isSorted(arr, n));//检验算法的合理性
return;
}
整体代码:
#include<iostream>
#include<ctime>
#include"sortTestHelper.h"
#include <cassert>
using namespace std;
//插入排序代码
template <typename T>
void insertionSort(T arr[],int n) {
for (int i = 1; i < n; i++) {
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j-1])
swap(arr[j-1], arr[j]);
else
break;
}
}
}
//检测算法的合理性
template <typename T>
bool isSorted(T arr[], int n) {
for (int i = 0; i < n-1; i++) {
if (arr[i] > arr[i + 1])
return false;
else
return true;
}
}
//计算算法运行时间
template <typename T>
void testSort(const string& sortName, void(*sort)(T[], int), T arr[], int n) {
clock_t startTime = clock();
sort(arr, n);
clock_t endTime = clock();
cout << "time="<<double(endTime - startTime)/CLOCKS_PER_SEC << endl;
assert(isSorted(arr, n));//检验算法的合理性
return;
}
//随机生成测试用例
int* generateRandomArrary(int n, int rangeL, int rangR) {
assert(rangR > rangeL);
int* arr = new int[n];
srand(time(NULL));
for (int i = 0; i < n; i++) {
arr[i] = rand() % (rangR - rangeL + 1) + rangeL;
}
return arr;
}
int main() {
int n = 1000;
int* arr = generateRandomArrary(n,0,n);
/*insertionSort(arr,n);
for (int i = 0; i < n; i++)
cout << arr[i] << endl; */
testSort("insterSort",insertionSort,arr,n);
}
运行结果:
time = 0.034
插入算法的改进
改进思想为使用移位替换的方式代替swap的方式。
//插入排序改进
template <typename T>
void insertionSort(T arr[], int n) {
for (int i = 1; i < n; i++) {
T e = arr[i];
int j;
for ( j = i; j > 0&& e < arr[j - 1]; j--) {
if(e < arr[j - 1])
arr[j] = arr[j - 1];
}
arr[j] = e;
}
}