插入排序(折半查找优化插入排序||希尔排序) _清风明月

插入排序:
 
插入排序分为三个步骤:
1. 找位置。(序列可分为两个部分,第一个部分是有序序列,其二是非有序序列。当为有序序列时,查找可以改进为折半查找,优化算法速度。)
2. 移动。
3. 插入。
 
查找的折半查找:(基于已经有序的序列:升序)
while(low>=high)时
low________mid________high
low=0      key        high=length-1
如果key值(目前需要比较的值)比mid值小,则查找左半部分,high=mid-1
反之,比mid值大,则查找右半部分,low=mid+1
 
优化可用希尔排序进行排序
希尔排序,从第一个开始,每到第x个,就打上标记,以间隔为x的元素进行比较,可进行多次比较。
x=5.
49  38  65  97  76  13  27  49  55  04
*    &  ^            *  &   ^
希尔排序的x,将被统一存入一个一维数组进行调用,but最后的间隔必须为1,也就是插入排序。
使用希尔排序的算法,可以类似于把区间进行整齐的区域划分(这里跟归并排序的思想有点相似。),希尔排序作用:防止最坏可能调用原始插入排序的时间复杂度。
 
1.插入排序
自拟题目格式:
输入:
一共T组数据。
每组数据,n个需要排序的数。n<=100;
排序按照升序进行排序。
实验数据:
2
5
11 32 22 58 96
4
3 4 5 1
 
2. 折半查找
自拟题目格式:
输入:
一共T组数据。
每组数据,n个需要排序的数。n<=100;
排序按照升序进行排序。
实验数据:
2
5
11 32 22 58 96
4
3 4 5 1
 
3. 希尔排序
自拟题目格式:
输入:
一共T组数据。
每组数据,t个不同值的间隔x1,xt;
每组数据,n个需要排序的数。n<=100;
排序按照升序进行排序。
实验数据:
3
3 5
5 2 1
11 32 22 58 96
3 4
5 2 1
3 4 5 1
3 10
49 38 65 97 76 13 27 49 55 04
 
插入排序代码:
#include"stdafx.h"
#include<iostream>
using namespace std;
int main()
{
int T, n, i, j, a[105], k;
cin >> T;
while (T--)
{
cin >> n;
for (i = 0; i < n; ++i)
cin >> a[i];
for (i = 1; i < n; ++i)
for (j = 0; j < i; ++j)
{
if (a[i] < a[j])
{
int key = a[i];//1
for (k = i - 1; k >= j; --k)
a[k + 1] = a[k];//5//4//3
a[k+1] = key;//1
}
}
for (i = 0; i < n; ++i)
cout << a[i] << " ";
cout << endl;
}
return 0;
}
 
插入排序折半查找优化代码:
//折半查找
int main()
{
int T, n, a[105], i, j, low, high, mid = 0;
cin >> T;
while (T--)
{
cin >> n;
for (i = 0; i < n; ++i)
cin >> a[i];
for (i = 1; i < n; ++i)//a[i]是要查找的数。
{
high = i - 1, low = 0;
while (low <= high)
{
mid = (low + high) / 2;
if (a[i] < a[mid])
high = mid - 1;
else
low = mid + 1;
}
if (a[i] < a[mid])
{
int key = a[i];//1
for (j = i - 1; j >= mid; --j)
a[j + 1] = a[j];//5//4//3
a[j + 1] = key;//1
}
}
for (i = 0; i < n; ++i)
cout << a[i] << " ";
cout<<endl;
}
return 0;
}
 
 
插入排序希尔排序优化代码:
int main()
{
int T, t, n, i, j, k, l, a[105], xier[5];
cin >> T;
while (T--)
{
cin >> t >> n;
for (i = 0; i < t; ++i)
cin >> xier[i];
for (i = 0; i < n; ++i)
cin >> a[i];
for (l = 0; l < t; ++l)
{
for (i = xier[l]; i < n; i += xier[l])//a[i]是要查找的数。
for (j = 0; j < i; j += xier[l])
{
if (a[i] < a[j])
{
int key = a[i];//1
for (k = i - xier[l]; k >= j; k -= xier[l])
a[k + xier[l]] = a[k];//5//4//3
a[k + xier[l]] = key;//1
}
}
}
for (i = 0; i < n; ++i)
cout << a[i] << " ";
cout << endl;
}
return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值