一、排序的基本概念与分类
1、含有n个记录的序列为r1到rn,其相应的关键字分别为k1到kn,需确定1到n的一种排列p1到pn,使其相应的关键字满足kp1小于等于一直到kpn(非递减或非递增)关系,即使得序列称为一个按关键字有序的序列rp1到rpn,这样的操作就称为排序;
2、排序的稳定性:
假设ki=kj(i和j在1到n之间,且i不等于j),且在排序前的序列中ri领先于rj(即i<j)。如果排序后ri仍领先于rj,则称所用的排序方法是稳定的;反之,若可能使得排序后的序列中rj领先ri,则称所用的排序方法是不稳定的;
3、内排序与外排序
根据在排序过程中待排序的记录是否全部被放置在内存中,排序分为:内排序和外排序;
内排序是在排序整个过程中,待排序的所有记录全部被放置在内存中;
外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行;
4、对于内排序来说,排序算法的性能:
时间性能;
辅助空间;
算法的复杂性;
5、根据排序过程中借助的主要操作,把内排序分为:插入排序,交换排序,选择排序和归并排序;
二、冒泡排序
1、冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止;
时间复杂度O(n^2);
三、简单选择排序
1、简单选择排序法就是通过n-i此关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(i在1到n之间)个记录交换之;
特点是交换移动数据次数相当少,时间复杂度O(n^2);
四、直接插入排序
1、直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表;
时间复杂度O(n^2);
五、希尔排序
1、所谓的基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间;
2、跳跃分割:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序;
3、增量序列的最后一个增量值必须等于1才行;由于记录是跳跃式的移动,希尔排序并不是一种稳定的排序算法;
时间复杂度(O(n^(3/2)));
六、堆排序
1、堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆;
2、**堆排序(heap sort)**就是利用堆进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆(或小顶堆也可以)。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值。如此反复执行,便能得到一个有序序列了。
时间复杂度O(nlogn),不稳定排序法
七、归并排序
1、归并排序就是利用归并的思想实现的排序算法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2向上取整个长度为2或1的有序子序列;再两两归并,如此重复,直至得到一个长度为n的有序序列为止;
时间复杂度O(nlogn),递归的空间复杂度O(n+logn);稳定算法
非递归的空间复杂度为O(n);
八、快速排序
1、快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序的目的;
2、partition函数要做的,就是先选取当中的一个关键字,然后想尽办法将它放到一个位置,使得它左边的值都比它小,右边的值比它大,这样的关键字称为枢轴(pivot);
时间复杂度O(nlogn),空间复杂度O(logn),不稳定算法
3、可以随机获得一个low与high之间的数rnd,称为随机选取枢轴法;
4、三数取中法:即取三个关键字先进行排序,将中间数作为枢轴,一般是取左端、右端和中间三个数,也可以随机选取;
5、九数取中法:先从数组中分三次取样,每次取三个数,三个样品中各取出众数,然后从这三个中数当中再取出一个中数作为枢轴;
6、



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



