直接插入排序
1.思想
每次将一个新数据插入到有序队列中的合适位置里。
2.代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int list[8]={9,0,6,7,1,5,4,8};
int j = 0;
/***********************************************************************/
// 第1个数肯定是有序的,从第2个数开始遍历,依次插入有序序列
for (int i = 1; i < 8; i++)
{
// 取出第i个数,和前i-1个数比较后,插入合适位置
int temp = list[i];
// 因为前i-1个数都是从小到大的有序序列,所以只要当前比较的数(list[j])比temp大,就把这个数后移一位
for (j = i - 1; j >= 0 && temp < list[j]; j--)
{
list[j + 1] = list[j];
}
//插入值
list[j + 1] = temp;
/***********************************************************************/
//输出 前i个排序后的结果
for(int k=0;k<=i;k++)
{
cout<<list[k]<<" ";
}
cout<<endl;
}
}
3.性能
希尔排序
1.思想:
增量排序,希尔(Shell)排序又称为缩小增量排序,它是一种插入排序,把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。
2.代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int list[8]={9,0,6,7,1,5,4,8};
int length=sizeof(list)/sizeof(int);
int gap =length / 2;
int j = 0;
while (gap>=1)
{
//把距离为 gap 的元素编为一个组,扫描所有组
for (int i = gap; i < 8; i++)
{
int temp = list[i];
//对距离为 gap 的元素组进行直接插入排序
for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap)
{
list[j + gap] = list[j];
}
list[j + gap] = temp;
}
/*****输出***********/
cout<<"gap: "<<gap<<endl;
for(int i=0;i<8;i++)
{
cout<<list[i]<<" ";
}
cout<<endl;
/*******************/
gap = gap / 2; // 减小增量
}
}
3.性能分析
附加1:直接插入和希尔的比较: