《数据结构》——排序
??? 一、 概述 ??
??? 排序(Sorting)是数据处理中一种很重要的算法。一般情况下,排序操作在数据处理过程中要花费许多时间,为了提高计算机的运行效率,人们提出不断改进的排序算法,这些算法也从不同种角度展示了算法设计的某些重要原则。谈到了计算的效率,就得说说算法的时间复杂度与空间复杂度,在排序中的时间复杂度指的是键值比较的次数和记录移动的次数。空间复杂度为该算法所耗费的存储空间。下面我们看一看具体的排序算法。 ??? 二、 排序的分类? ? 在计算机内部,排序算法分为两大类,一个是内部排序,一个是外部排序。 ??? 内部排序:带排序的记录全部放在计算机内存中进行的过程,其特点是待排序记录少,内存中可以放得下。 ??? 外部排序:待排序的记录数量很大,内存中不能存储全部的记录,需要对外存进行访问的排序过程。 ??? 三、导图分析??? 从上面的一张图中我们可以看出来,今天我们主讲的是内部排序,内部排序主要分为插入排序,交换排序、选择排序、归并排序。 ??? 1、 直接插入排序??? 基本思想:依次将每个记录插入到一个已经排好的有序表中去,从而得到一个新的,记录数增加1的有序表。算法描述如下 void StraightInsertSort(List R,int n) {int i,j; for(i=2;i<=n;i++) // 从第二个数开始插入 {R[0]=R[i]; //将待插入的数保存起来 j=i-1; while(R[0].key<R[j].key)//将带插入的数与有序序列中的数做比较,若待插入的数小于比较的数 {R[j+1]=R[j];//将第j个记录赋值给第j+1个记录 j--; //j自动减1,然后继续循环,找到要插入的位置 } R[j+1]=R[0];//找到位置后,将R[0]插入 } }??? 这个算法核心在于将待插入有序表中的数依次与有序表中的数比较大小,这样才能找到插入的位置。其时间复杂度为,空间复杂度为O(1)。 ??? 特点 ??? 时间复杂度:O(n2) ??? 空间复杂度:O(1) ??? 稳定性:稳定 ??? 缺点:比较次数不一定,比较次数越多,插入点后的数据移动越多。(从后往前比较) ??? 2、冒泡排序??? 基本思想:将第一个记录的键值和第二个记录的键值进行比较,若为逆序,则将这两个记录交换,然后再将第二个键值与第三个键值比较,若为逆序,则交换,依次类推,其总体思想是大数沉底,小数上浮。 ? 算法描述如下 void BubbleSort (List R,j,temp,endsort; for(i=1,i<=n-1;i++) {endsort=0; for(j=1,j<=n-i;j++) {if(R[i].key>R[j+1].key) //从前往后比,若为逆序则交换记录 {temp=R[j]; R[j]=R[j+1]; R[j+1]=temp; endsort=1; } } if (endsort==0) break;//endsort是一个标志,若endsort==0,证明将要排序的表已经按照从小到大的顺序已经排好 } } ?? 冒泡排序也是双重循环,核心思想在比较与交换上,以前和小伙伴们讨论冒泡是从前往后比还是从后往前比,其实这两种都能使大数沉底小数上浮,只不过改一下比较条件罢了。 ??? 特点 ??? 时间复杂度:O(n2) ??? 稳定性:稳定 ??? 缺点:慢,每次只能移动相邻两个数据。 ??? 3、直接选择排序??? 基本思想:每一次在n-i+1(i=1,2,3,4,...,n-1)个记录中选取键值最小的记录作为有序序列的第i个记录。 ??? 算法描述如下 void SelectSort(List R,int n) {int min,i,j; for(i=1;i<=n-1;i++) //每次循环,找出一个最小的键值 { min=i; for(j=i+1,j<=n;j++) if (R[j].key<R[min].key) min=j;//记录键值较小的记录的下标,这里没有动数的位置 if (min!=i) swap(R[min],R[i]); //将最小的键值记录与第i个记录交换,其它记录保持不动 } }?? 特点: ?? 时间复杂度:O(n2) ?? 稳定性:不稳定 ?? 缺点:在n个键值中选出最小值,至少进行n-1次比较,在剩余的n-1个键值中再选取次小值的时候,还要进行n-2次比较,不能利用以前的比较信息,也即是说比较次数多。 ?? 直接插入排序VS直接选择排序?? 1、算法的主要逻辑定位不同 ??? 直接插入排序将算法的逻辑主要用在已经排好的序列中,在已经排好的序列中找到插入位置,直接选择排序是将算法的逻辑用在未排好的序列中,在未排好的序列中查找最小的数值。 ?? 2、稳定性不同 ?? 直接插入排序算法是稳定的,直接选择排序算法是不稳定的。 ?? 小结
?? 其它的排序算法不具体介绍了,由于排序算法的多样性,很难确定一种最好的算法,例如,当待排序的序列已经基本有序时,插入排序和交换排序是比较有效的,当待排序的记录数较大时,选择排序比较有效,各种方法都有自己不同的适用情况,我们在实际的应用中应该适当选择排序算法。 (编辑:ASP站长网) |