小试直接插入排序

 今天突然想尝试看一下算法导论,主要是想对这本书有一个大致的了解。百度搜索之后出现了网易公开课,这确实比较好,在今后的学习帮助会很大。

学习算法导论要做的知识储备:计算机科学与基础,离散数学,概率论和一些编程知识;

然后就对算法设计做出概念性的解释。

另外开始今天的主体直接插入排序:

百度到:

直接插入排序(straight insertion sort)的作法是:

  每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。  第一趟比较前两个数,然后把第二个数按大小插入到有序表中第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。  直接插入排序属于稳定的排序,最坏时间复杂性为Θ(n^2),空间复杂度为O(1)。  直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。  值得注意的是,我们必需用一个存储空间来保存当前待比较的数值,因为当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位 插入排序类似玩牌时整理手中纸牌的过程。插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。

问题要用之前学习到C++的代码实现,想到先将数组保存到容器里,但是确实不好实现而且有些复杂

最后还是改用for循环得到

#include<iostream>
#include<vector>
using namespace std;void insert_sort(int a[], int n)
{
 int i, j, temp;
 for (i = 1; i < n; ++i)
 {
 temp = a[i];
 for (j = i; j>0 && temp < a[j - 1]; --j)//降序排列
 {
 a[j] = a[j - 1];
 }
 a[j] = temp;
 }
}


int main()
{
 int ia[]={12,15,9,20,6,31,24};
 insert_sort(ia,6);
 vector<int> str(ia,ia+6);
 for(vector<int>::iterator ix=str.begin();ix!=str.end();++ix)
 cout<<*ix<<endl;
 return 0;
}

这后面还有一个用伪代码带注释的

void insert_sort(int a[], int n)
{
int i,j;
int tmp;
for(i=0;i!=n;i++)//for i <- 1 to length[A] i为待插入数字
{
j=i;
tmp = a[i];//do tmp=a[i]
while(j > 0 && tmp > a[j-1])//while j>0 and A[j-1]>tmp
{
a[j]=a[j-1];//do A[j]=A[j-1]
j--;//j=j-1
}
a[j]=tmp;//A[j+1]=tmp;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值