到了大三才发现自己大二缺了多少的功课,最近开始看算法导论,将以前丢掉的拾起来。
在看完2.1插入排序之后,做了一下课后习题,看到这个算法—选择算法
选择算法的思想是:
第一次取得数组的最小元素,放在第一个位置。接着取得数组的第二小元素,放在第二个位置。。。。如此下去,直到找到倒数第二小的元素,放在倒数第二个位置,这样排序便完成了
书上的题目有一下几个问题:
1.该算法的循环不变式是什么?
2.为什么他只需要对前面的n-1个元素,而不是n个元素运行?
3.用θ表示最坏情况
首先用c++实现算法
void ChoseSort(int len,int a[])
{
int key = a[0];
int pos = 0;
for(int i =0;i<len-1;i++)
{
key = a[i];
pos = i;
for(int j = i;j<len;j++)//寻找最小元素
{
if(a[j]<key)
{
key = a[j];
pos = j;
}
}
//交换结果
a[pos] = a[i];
a[i] = key;
}
}
现在来看上面的问题
1.循环不变式问题,就是要证明这样做的科学性。需要证明三条性质
初始化,保持,终止
初始化:将最小的放在首位置
保持:每次找到比剩余里面最小的,放到相应位置
终止:len-1
2.很简单,第i-1小知道了,剩下一个肯定是倒数第一小
3.看看这个算法
不管数据如何分布,这个算法总需要比较
n-1 + n-2 +。。。。。+1 = (n-1)*n/2次
所以算法的最坏复杂度为θ(n*n)
这个算法很简单,但是在手写的时候还是出现了一些问题,还需多加练习。。