从基础开始进行排序算法复习
学的东西不用就忘,到现在排序算法记得不是很清楚,捡起来复习。从底层和原理复习,加深记忆。
0.数组
对数组结构元素进行排序。C++中的数组这一数据结构特点:下标访问;连续存储;固定长度
1.插入排序
举个比较好理解的例子:现实生活中打牌的时候,拿好一些未排序的牌在手上之后,把牌整理成从左到右依次增大。当然啦,在现实生活中我们是随意整理,只要最后把牌升序整理好就行,但是算法过程要从计算机的角度来思考,计算机只能重复地进行有规律的顺序操作。所以先整理出一个计算机能做到的机械性做法,在使用算法来实现它。
①从最左边开始,向右,第二张牌与第一张比较,如果第二张牌更小,则交换;
②第三张牌与前面的2张牌都比较,把第三张牌放到合适的位置:第三张牌与第二张比较,第三张更小则交换;第三张牌再与第一张牌比较,更小则交换。
③往后以此类推,直到最后一个数组元素。
从这三个步骤得到伪代码结构:首先是一个for循环,循环数组的第二个元素到最后一个元素,这个循环是选出要进行插入的元素 a [ i ] ; 在循环内还要有一个for循环,这个循环遍历的是 a [ i ] 将要插入的部分的所有元素,是 a [ i ] 原来位置之前的所有元素。
简化后的规则为:1.从第2个数(下标为1)开始到最后一个数,每一个数都与前面的所有数进行比较,即 i = 1~array.length() ; 2. 第 i 个数要进行比较的数的下标为 j = 0 ~ i -1
如图:
总体来看,插入排序在数组中维持两个部分: 已经排好序的部分( i 之前的部分)和未进行排序的部分( i 和 i 后面的部分)。然后在循环地选择数组中的每个元素,通过与已经排好序的部分比较,把选择出来的数加入到已经排好序的部分中。通过这样的顺序选择,使排好序的元素越来越多,完成整个数组的排序。
代码如下(以长度为10的数组进行示范):
void InsertSort(int array[10]){
int temp;
for(int i=1;i<10;i++){
for(int j=0; j <= i-1; j++){
if(array[i] < array[j]){
temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
}
2.冒泡排序
回忆一下最长公共子序列算法,是先比较最后的元素是否相同,如果相同,就作为公共子序列的一部分,如果不同,就分支再比较选择。当然啦,最长公共子序列算法是要比冒泡排序算法复杂得多的,还包含了递归和动态规划等思想。
冒泡排序算法与它的相同之处在于,先选出最后一个元素,进行循环,就能得到有序的数组。即如果是在升序排序中,每次都找到最大的元素,然后将最大的元素移动到数组最末端,进行一次循环后,最末的数组元素已经确定,此时再对出最末元素以外的元素( a [ n-1 ] )进行相同的操作,以此类推,就得到有序的数组。
关于排序算法其实理解了一个算法之后,其他的就很好理解了,所以在此就不作图了,可以在纸上随意画出一个模型加深理解,直接贴排序函数代码
void BubbleSort(int a[10],int len){
int temp;
for(int i=len;i>=0;i--){
// - last e repeat
for(int j=0;j<10;j++){
if(a[j] > a[j+1]){
//exchange
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}