1.选择排序
基本思想:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到所有待排序的数据元素排完。
2.直接插入排序
基本思想:
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到所有记录插入完成为止。
3.冒泡排序
基本思想:
依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。而后比较第2个数和第3个数,将小 数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(由于 可能因为第2个数和第3个数的交换,使得第1个数再也不小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已是最大的), 第二趟结束,在倒数第二的位置上获得一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 因为在排序过程当中老是小数往前放,大数日后放,至关于气泡往上升,因此称做冒泡排序。
4.Shell排序
基本思想:
先取一个小于n的整数d1做为第一个增量,把文件的所有记录分红d1个组。全部距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;而后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即全部记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
5.堆排序
基本思想:
① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此获得新的无序区R[1..n-1]和有序区R[n],且知足R[1..n-1].keys≤R[n].key
③因为交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然 后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此获得新的无序区R[1..n-2]和有序区R[n- 1..n],且仍知足关系R[1..n-2].keys≤R[n-1..n].keys,一样要将R[1..n-2]调整为堆。 ……
直到无序区只有一个元素为止。
6.快速排序
基本思想:
快速排序(Quicksort)是对冒泡排序的一种改进。
它的基本思想是:经过一趟排序将要排序的数据分割成独立的两部分,其中一部分的全部数据都比另一部分的全部数据都要小,而后再按此方法对这两部分数据分别进行快速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列。
7.归并排序
基本思想:
归并排序是创建在归并操做上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个很是典型的应用。将已有序的子序列合并,获得彻底有序的序列;即先使每一个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
归并操做的工做原理以下:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另外一序列剩下的全部元素直接复制到合并序列尾
8.基数排序
基本思想:
基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的做用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采起的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。
最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分红子组,以后,对后面的关键码继续这样的排序分 组,直到按最次位关键码kd对各子组排序后。再将各组链接起来,便获得一个有序序列。
最低位优先(Least Significant Digit first)法,简称LSD法:先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便获得一个有序序列。git