从今天开始每天至少一个算法开始写博客
算是自己对自己的一个监督吧!只写代码,不讲原理!有问题自己查,也希望大家能给我改错!
所有代码在VS2010均调试通过!顺便推荐大家一款软件Visual Assist 10.8.2029 (General Release)
插入排序:
#include <iostream>
#include <vector>
using namespace std;
void show(vector<int> & v)
{
vector<int>::iterator pos;
for(pos = v.begin();pos != v.end();pos++)
std::cout<<*pos<<" ";
std::cout<<std::endl;
}
void insertSort(vector<int> & v)
{
int key;
int lhs =v.size();
for (auto i = 1;i < lhs;i++)
{
key =v[i];
int j;
for (j =i-1;j >= 0&&v[j] > key;j--)//结束条件为两个一起判断,单个判断会有问题
v[j+1] =v[j];//
v[j+1] = key;//
/* while (j>=0&&v[j]>key)
{
v[j+1]=v[j];//该注释与上面所有有注释//的代码行等价
j--;
}
v[j+1]=key;*/
}
}
void main()
{
const int n=20;
vector<int> v;
v.reserve(50);
for(int i =0;i<n;i++)
v.push_back(rand()%10);
show(v);
insertSort(v);
show(v);
system("pause");
}
期间出现了小小的问题:
for (j =i-1;j >= 0&&v[j] > key;j--)//结束条件为两个一起判断,单个判断会有问题
v[j+1] =v[j];//
上面代码我用以下代码代替了
for (j =i-1;j >= 0;j--)
{
if (v[j] > key)
{
flag =0;
v[j+1] =v[j];
}
}
没有想清楚感觉上两个代码相同,但是下面的那个代码改变了j的值,这样就不能准确的找出需要替换的那个元素了
v[j+1] = key;//
归并排序:
#include <iostream>
#include <vector>
using namespace std;
vector<int> & merge(vector<int> & v,int p,int q,int r)
{
int m = r-p+1;
vector<int> v1(m);//申请个大小为r-p+1的vector来存储排序结果
int i = p,j = q+1;//算法导论将v1[p,q]v2[q+1,r]给单独复制出来了
for (auto k =0;k < m;k++)
{
if (i <= q&&j <= r)//算法导论上面试复制了vector,这里我直接用原数据做的,所以做了下判断
{ //两个数组都没读取完毕
if (v[i] <= v[j])
{
v1[k] = v[i];
i++;
}
else
{
v1[k] = v[j];
j++;
}
}
else if (i > q && j <= r)
{//v1读取完毕,v2直接复制到结尾,这里的v1与v2是注释里面的
v1[k] = v[j];
j++;
}
else if (i <= q && j > r)
{//v2读取完毕,v1直接复制到结尾
v1[k] = v[i];
i++;
}
}
for (auto k =0;k < m;k++)//复制到原来位置
{
v[p+k] =v1[k];
}
return v;
}
void mergeSort(vector<int> & v,int p,int r)
{
int q = (p+r)/2;
if (p<r)
{
mergeSort(v,p,q);
mergeSort(v,q+1,r);
merge(v,p,q,r);
}
}
void show(vector<int> & v)
{
vector<int>::iterator pos;
for(pos = v.begin();pos!=v.end();pos++)
cout<<*pos<<" ";
cout<<endl;
}
void main()
{
vector<int> v;
v.reserve(50);
const int n =10;
for(auto i =0;i < n;i++)
v.push_back(rand()%5);
show(v);
mergeSort(v,0,n-1);
show(v);
system("pause");
}