数据结构中的排序算法很经典,在软考中所占据的分数也不少,下面就跟大家细说一下排序算法吧。
算法排序大致分为5类:插入排序,选择排序,交换排序,归并排序,基数排序。
【插入排序】
插入排序
有直接插入排序和希尔排序算法。
直接插入排序,输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕。
每次插入都是从第0个元素开始比较,若原数列为递增数列,则排在小于第i个元素的前面,反之,则从插到大于第i个元素的后面。
例如递增数列:12 28 45 76,插入30,则从第0个元素(12)开始比较,一直到第2个元素(45),小于第2个元素,所以排在第2个元素(45)的前面。
直接排序是一个一个的比较,所以我给它起名叫“蜻蜓点水”。
希尔排序
是对一个无序数列进行排序。是将整个无序数列分割成若干小的子序列分别进行直接插入排序的方法(初次取序列的一半为增量d,以后每次减半,直到增量为1。如果d为偶数,则加1,保证d为奇数)。
图解:
希尔排序这种先分组,再排序,通过组内排序达到整个排序的目的的算法,我也给它赋予了一个名字“攘外必先安内”
【选择排序
】
选择排序有直接选择排序和堆排序。
直接选择排序:
第1趟通过n-1次关键字的比较,从n个记录中选出关键字最小的记录,和第1个记录进行交换。然后从剩余的n-1里再找最小的和第二个元素交换,以此类推,直到所有记录排序完成为止。
图解:
直接选择排序,从中挑选最小的一个,然后进行交换,就像古代皇帝点状元一样,所以给它起名“金榜题名”吧。
堆排序:
将一个序列按完全二叉树的形式构建堆,通过排序,使得所有父节点都比其孩子节点要大(大顶堆,值最大的节点为根节点)或小(小顶堆,值最小的节点为根节点)。
排序过程:
将序列按完全二叉树的形式构建
堆
,
然后从第n/2个元素开始判断,如果该节点的孩子节点比父节点大,则孩子节点与父节点互换。
图解:
堆排序排出来的效果一头小,一头大,就像一个圆锥,所以我给它起名“颠倒圆锥”。
【交换排序 】
交换排序有冒泡排序法和快速排序法。
冒泡排序法:
有2种排序方式,第一种排法:由第一个元素跟前面的元素依次比较,如果后面的数比第一个数小,则交换,最终一个位置是存放的最小的数,然后从第2个数开始,一次类推。第二种排法:从第一个开始,
依次比较相邻两个数,将大数放在后面,一次排完后,最大的数在最后,然后还是从第一个数开始,到倒数第二个数停止,找出次大的数,然后继续循环。
图解:
快速排序法:
采用
分治思想,选取一个数作为基数,然后对序列进行排序,小于基数的放在
基数
前面,大于基数的放在基数后面。完成一次排序后,再对前后2个集合进行相同的排序。
图解:
【归并排序 】
归并排序:
归并排序法也是采用的分治法思想。首先将n个元素分成两个含n/2元素的子序列;然后再将两个子序列递归排序(最后可以将整个原序列分解成n个子序列);最后合并两个已排序好的序列。
图解:
【基数排序 】
基数排序 :
是根据数字的性质来逐个根据个位数、十位数、百位数分类求得进行分类
。
图解: