直接插入排序即在有序数列的基础上进行排序算法。对一个初始数列排序,第一个元素默认为一个只有一个元素有序数列,然后依次增加元素进行排序组成有序数列,即从数列中的第二个元素进行排序。利用一个空间存储待排序的末尾元素,依次比较已有序数列中元素与末尾元素大小,确定插入位置(在比较的同时完成数列中的元素的移动),将末尾元素插入位置,完成排序。
#include<iostream>
using namespace std;
int main()
{
int a[7] = { 135, 45, 144, 474, 74, 1, 5 };
for (int i = 0; i <=6; i++)
{
cout << "a["<<i<<"]"<<a[i]<<endl;
}
// 直接插入排序
int j;
for (int i = 1; i < 7; ++i)
{
int temp = a[i];
j = i - 1;
while (temp<a[j] &&j>=0)
{
a[j+1] = a[j];
--j;
}
a[j+1] = temp;
}
cout << "排序后。。。。。" << endl;
for (int i = 0; i <= 6; i++)
{
cout << "a[" << i << "]" << a[i] << endl;
}
system("pause");
return 0;
}
折半插入排序原理同直接插入排序,只是在寻找确定插入位置时方法不同,运用折半的方法确定插入位置,在确定查找方法在一定条件下会比直接插入排序算法更高效,应该是直接插入排序的改良版本。(由于运用Low和High来确定整个数列,所以Low和High的值不能定为0)
#include<iostream>
using namespace std;
int main()
{
int a[7] = { 135, 45, 144, 474, 74, 1, 5 };
for (int i = 0; i <= 6; i++)
{
cout << "a[" << i << "]" << a[i] << endl;
}
// 折半插入算法排序
int Low, High,Medium,temp,p;
for (int i = 2; i < 8; ++i)
{
Low = 1;
High = i-1;
temp = a[i-1];
while (Low <= High)
{
Medium = (High + Low) / 2;
if (temp < a[Medium-1])
{
High = Medium - 1;
}
if (temp > a[Medium-1])
{
Low = Medium + 1;
}
}
for (int j=i-1; j >High; --j)
{
a[j] = a[j-1];
}
a[High] = temp;
}
cout << "排序后。。。。。" << endl;
for (int i = 0; i <= 6; i++)
{
cout << "a[" << i << "]" << a[i] << endl;
}
system("pause");
return 0;
}
插入排序算法更适合对已有序数列添加元素后进行排序。。。。。