算法导论学的第一个算法就是插排,
用c++实现.
代码如下:
明显有很多地方可以优化。
头文件:
#include<iostream>
#include<vector>
using namespace std;
class InertSort
{
public:
void insersort(vector<int> &array) //注意,这里需要用引用
{
int len = array.size();
if (len < 1) //保护
return;
for(int j =1;j<len;j++)
{
int key = array[j]; //取出j位置上的key值
int i = j - 1;
while (i >= 0 && array[i] > key) //i可以等于0
{
array[i + 1] = array[i]; //若前面的数大,则这个值放在key的位置上.
i = i - 1; //再比较更前一个数,直到比key小.
}
array[i + 1] = key; //因为array[i]<key则将key放在array[i
+1]上
}
}
void sprint(vector<int>array)
{
for (int i = 0; i < array.size(); i++)
{
cout << array[i] << " ";
}
}
};
主文件:
#include "stdafx.h"//上述头文件
int main()
{
vector<int> arr(10, 0);
arr[0] = 10;
arr[1] = 2;
arr[3] = 18;
arr[4] = 5;
arr[8] = 9;
arr[9] = 20;
//vector<int> data = { 10,9,3,4,5,6,7,8,1,2 }; 可以直接这样初始化
InertSort s;
cout << "插排排序前数组" << endl;
s.sprint(arr);
s.insersort(arr);
cout << endl;
cout << "插排排序后数组" << endl;
s.sprint(arr);
system("pause");
return 0;
}
此后,我将头文件的插排换种写法:
public:
void insersort(vector<int> &array)
{
int len = array.size();
if (len < 1)
return;
for(int j = 1;j<len;j++)
{
for (; j > 0 && (array[j - 1] > array[j]); exch(array, j - 1, j); j--);
}
}
void exch(vector<int> &arr,int j,int i)
{
auto tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}