2.1 插入排序。
我们分析的第一个算法是插入排序算法,
输入:n个数(a1,a2,a3,a4,a5,a6,a7…..an)
输出:序列的一个排列(即重新排序)(a1’,a2¬’,a3’)使a1’<= a2¬’<= a3’
插入排序算法的伪代码是以一个过程的形式给出的,称为INSERTION-SORT,,它的参数是一个数组。包括了n个待排序的数。
伪代码INSERTION-SORT为
for j = 2,to length(A)
do key = A[j]
Insertt A[j] into the sorted sequence A[1...j-1]
i = j-1;
while(i>0 and A[i]>key)
do A[i+1] = A[i]
i = i-1;
A[i+1] - key;
证明成立:
初始化:首先,先证明在第一轮迭代开始之前,循环不变式是成立的。此时j = 2,而子数组A[1.2…j-1]。亦即,它只包含一个元素A[1],实际上就是最初在A[1]中的那个元素。这个子数组是己排序的(显然的。),这样就证明了循环不变式在循环的第一轮迭代开始之前是成立的。
保持:接下来,我们来考虑第二个性质:证明每一轮循环都能使循环不变式保持成立。从非形式化的门外 来看,在外层循环的循环体中,要将A[j-1],A[j-2]等元素向右移一个位置,直到找到A[j]的适当位置为止。这里将A[j]值插入。
结束:当j大于n时,外层for循环结束。
实例程序(自己先写的。)可直接复制运行(VS2010)。
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a[] = {12,563,6,98,63,54,26,88,46,2};
int n = sizeof(a)/sizeof(int);//数组中int的个数
for(int i = 1;i < n;i ++)
{
int key = a[i];
for(int j = i;j > -1;j --)
{
if(a[j]<a[j-1])//如果小于Key,则进行数值移动,其中包括了Key值的移动。即多次移动
{
a[j] = a[j-1];
a[j-1] = key;
}
else
break;//一旦有第一个数值小于key值,则跳出循环,即已经排序好了。
}
}
for(int i = 0;i < n;i ++)//重?新?输º?出?。¡ê
cout<<a[i]<<endl;
}
实例程序(标准伪代码的源程序)可直接复制运行(VS2010)。
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a[] = {12,563,6,98,63,54,26,88,46,2};
int n = sizeof(a)/sizeof(int); //数组中int的个数
for(int i = 1;i < n;i ++)
{
int key = a[i];
int j = i-1;
while((j>-1)&&a[j]>key)//这样做只需要移动大于key值的数值,而key值则不需要进行多次移动。
{
a[j+1]=a[j];
j = j - 1;
}
a[j+1] = key;
}
for(int i = 0;i < n;i ++)//重新输出。
cout<<a[i]<<endl;
}
可以先输入一个n值表示要排序的整数的个数。然后输入n个整数。最后重新输出排序后的排列组合。
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n ;//数组中int的个数
cin>>n;
int *a = new int[n];//动态创建包含n个整形的数组
for(int i = 0;i < n;i ++)//数组元素输入
{
cin>>a[i];
}
for(int i = 1;i < n;i ++)
{
int key = a[i];
for(int j = i;j > -1;j --)
{
if(a[j]<a[j-1])
{
a[j] = a[j-1];
a[j-1] = key;
}
else
break;
}
}
for(int i = 0;i < n;i ++)//重新输出
cout<<a[i]<<endl;
}
也可不先确定数组中元素个数。不断输入数组元素,直接输入结束符EOF;
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
vector<int> a;
int b;
while((cin>>b)&&(b != EOF))
a.push_back(b);
for(unsigned int i = 1;i < a.size();i ++)// a.size()为unsigned int型
{
int key = a[i];
for(int j = i;j > -1;j --)
{
if(a[j]<a[j-1])
{
a[j] = a[j-1];
a[j-1] = key;
}
else
break;
}
}
for(vector<int>::size_type i = 0;i < a.size();i ++)//a.size()返回类型为vector<int>类型的size_type型。
cout<<a[i]<<endl;
cout<<endl;
for(vector<int>::iterator i = a.begin();i != a.end();i++)//迭代器。
cout<<*i<<endl;
}