排序分为5类,本篇文章主要是研究选择排序,选择排序分为直接选择和堆排序。
选择:每一步都从待排序的记录中选择出最小的,按顺序存放在已排好序的记录后。
直接选择排序:
第一趟:
如上图初始状态为 3820 46 38 74 91 12 25,他们是带排序的记录,从待排序的记录中选择出最小的为12,按顺序存放在已排好序的记录后,因为还没有排好的序列,所以12就是第1个,和第一个38交换。
第二趟:
第一趟结束后,未排序的为上图“第1趟”中除‘12’外的其他的黑色的记录,重复从待排序的记录中选择出最小的为12,按顺序存放在已排好序的记录后,剩余的最小的为20,要放在12的后面,本例中不用动20
第三趟……一直到所有的比较完毕,这个排序的过程形成一个三角形,如上图中红色区。
时间复杂度:
如果带排序列有n个元素,第1趟要比较n-1次,第2趟n-2次吗,第n-1趟1次,所以排完所有的就要进行n(n-1)/2次,所以时间复杂度为O(n2)。
堆排序:
堆排序是对直接选择排序的改进,减少比较的次数,提高效率,比较复杂的是在建堆的过程。
建堆:
1、 按照层的顺序先建好一个二叉树。从0开始对节点进行编码。
2、 对于有n个元素的序列从 ⌊ n/2⌋-1(最后一个非叶子节点)开始比较,首先和其子节点,上图建的是小顶堆,所以如果比子节点小则交换,如果有两个子节点且都小于父节点,则将父节点和较小的节点交换。
3、 然后比较上一个节点,直到建好堆。
取出堆中的元素:
将根节点和最后一个叶子节点交换,然后重新建堆。重复过程直到所有的节点输出。
小结:
选择排序的中心思想就是“待排序的记录中选择出最小的,按顺序存放在已排好序的记录后”。堆排序是在直接排序上的一种改进,可以借助之前排序的结果,减少比较的次数,降低时间复杂度。