学习内容:
①算法(尤其是递归算法)复杂度的计算方法
②证明算法正确性的三个步骤 //虽然我没有怎么弄清楚
③几个排序算法的实现与比较
代码:
插入排序:
#include <iostream>
using namespace std;
int a[6] = {4,3,6,1,2,5};
int main()
{
int i,j,key;
for(j=1; j<6; ++j)
{
key = a[j]; //保存待插入的值
i = j-1;
//while(i>-1 && a[i]>key) (降序)
while(i>-1 && a[i]>key) //比key大就向后移
{
a[i+1] = a[i];
--i;
}
a[i+1] = key; //此时a[i]为第一个不比key大的元素
}
for(i=0; i<6; ++i)
cout<<a[i]<<' '; //输出
return 0;
}插入排序(递归):
#include <iostream>
#include <ctime>
using namespace std;
int a[6] = {4,3,6,1,2,5};
void insertSort(int cur)
{
if(cur == 0) return;
insertSort(cur-1); //递归直到a[0]
int key = a[cur];
while(--cur > -1 && a[cur] > key)
a[cur+1] = a[cur];
a[cur+1] = key;
}
int main()
{
int start = clock();
insertSort(5);
for(int i=0; i<6; ++i)
cout<<a[i]<<' '; //输出
cout<<endl<<"Run time:"<<clock()-start;
return 0;
}选择排序:
#include <iostream>
using namespace std;
int a[6] = {4,3,6,1,2,5};
int main()
{
int temp,min,i,j;
for(int i=0;i<5;++i)
{
min = i;
for(j=i+1;j<6;++j)
if(a[j]<a[min]) min = j;
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
for(i=0; i<6; ++i)
cout<<a[i]<<' '; //输出
return 0;
}归并排序(有哨兵):
#include <iostream>
#include <climits> //定义了INT_MAX
using namespace std;
int a[7] = {4,3,6,1,2,5,7};
void merge(int left, int mid, int right)
{
int l[mid-left+2];
int r[right-mid+1]; //待归并的两个数组
l[mid-left+1] = INT_MAX;
r[right-mid] = INT_MAX; //将数组末项置为int型最大值
int i,j,k;
for(i=0; i<mid-left+1; ++i)
l[i] = a[left+i];
for(j=0; j<right-mid; ++j)
r[j] = a[mid+1+j]; //设置两个数组
i = j = 0;
for(int k=left; k<=right; ++k)
{
if(l[i]<r[j]) a[k] = l[i++]; //归并的过程
else a[k] = r[j++];
}
}
void mergeSort(int left,int right)
{
if(left == right) return;
int mid = (left + right) / 2;
mergeSort(left, mid); //二分(至只有一个元素)
mergeSort(mid+1, right);
merge(left,mid,right); //归并
}
int main()
{
mergeSort(0,6); //对a[0,6]进行排序
for(int i=0; i<6; ++i)
cout<<a[i]<<' '; //输出
return 0;
}其它:
在求递归时间复杂度时,回忆起T1 = 1,Tn+1 = 2Tn + n(n>=2)下Tn的求法...
未解决问题:
2-1
本文详细介绍了几种常见的排序算法,包括插入排序(含递归版本)、选择排序和归并排序,并提供了具体的C++实现代码。此外,还探讨了算法的时间复杂度计算方法及算法正确性的验证步骤。

1万+

被折叠的 条评论
为什么被折叠?



