最近在学习算法导论;前两章讲的是排序的问题,就在博客上一下几个算法的思路和代码,当做是个练习吧。首先写
两个生成数据和打印数据的函数。
#include
#include
#include
#include
#include
void generate(int a[],int n) { srand(time(0)); for (int i=0;i
<一>插入排序;插入排序的思想很容易理解,就想打牌的时候一样;我们总是从从还没排好序的那一部分里找一个数
,把它插入到已经排好序的那一部分,这样这个数就从未排好序的那部分进入了排好序的那一部分;如此交替,知道每个数
都已经在排好序的那一部分里。分析复杂度:在最好情况下O(n),最坏情况之O(n^2)
代码如下:
void sort(int a[],int n);
void main()
{
extern void generate(int[],int);
extern void print(int[],int);
int a[50];
generate(a,50);
print(a,50);
sort(a,50);
print(a,50);
}
void sort(int a[],int n)
{
int i,j,temp;
for(j=1;j
=0;i--)
{
if(a[i]>temp)
{
a[i+1]=a[i];
}
else
break;
}
a[i+1]=temp;
}
}
<二>选择排序:这个方法来自于第二章练习题:首先找出A中最小元素,与A[0]交换,然后找出A中次小元素,与A[1]交换。。。。 代码如下:最好或最坏情况下都是O(n^2)
void sort(int a[],int n);
int find(int a[],int n,int i);
void main()
{
extern void generate(int[],int);
extern void print(int[],int);
int a[100];
generate(a,100);
print(a,100);
sort(a,100);
print(a,100);
}
void sort(int a[],int n)
{
int i,j;
for(i=0;i
<三>合并算法:用分治的方法,把每个序列分成两个序列,再分别对两个序列排序,然后将排好序的子序列合并;合并用到了
了递归(分治)的思想,为了研究复杂度,写出递归式。T(n)=2T(n/2)+O(n); O(n)是将两个排好序的子序列合并时的复杂度;
根据二叉树的启示,我们可以构造一个深度为lgn+1的二叉树,每一次都有cn的操作,总的复杂度为O(nlgn)
#include
void sort(int a[],int p,int r);
void merge(int a[],int p,int q,int n);
void main()
{
extern void generate(int[],int);
extern void print(int[],int);
int a[100];
generate(a,100);
print(a,100);
sort(a,0,100);
print(a,100);
}
void sort(int a[],int p,int r)
{
int q;
if(p
<四>合并排序和插入排序;已经发现在一定范围内,nlgn>n^2;所以在先使用合并算法,当
n较小时,插入排序。
#include
void sort(int a[],int p,int r);
void merge(int a[],int p,int q,int n);
void sort2(int a[],int p,int r);
void main()
{
extern void generate(int[],int);
extern void print(int[],int);
int a[100];
generate(a,100);
print(a,100);
sort(a,0,100);
print(a,100);
}
void sort(int a[],int p,int r)
{
int q;
if(p<(r-40))
{
if(p
=0;i--)
{
if(a[p+i]>temp)
a[p+i+1]=a[p+i];
else break;
}
a[p+i+1]=temp;
}
}