插入排序
排序思想
将排序序列分为两部分,前一部分是已排序的序列,后一部分为待排序序列。
每次从待排序序列中选择一个元素,依次比较其和已排序序列中的元素的大小,直到找到一个比它大的元素,并将其插入到这个元素前边。重复上步,直到待排序序列中没有元素了。
排序示例
对序列[3, 4, 63, 4, 0, 1, 32, -2]进行排序。
首先将序列分为两部分:待排序序列[4, 63, 4, 0, 1, 32, -2]、已排序序列[3]。
第一轮排序,从待排序序列中选取元素4,依次和已排序序列中元素比较,未找到比4大的元素,结束。
此时已排序序列为[3, 4]、待排序序列为[63, 4, 0, 1, 32, -2]。
第二轮排序,从待排序序列中选取元素63,依次和已排序序列中元素比较,未找到比63大的元素,结束。
此时已排序序列为[3, 4, 63]、待排序序列为[4, 0, 1, 32, -2]。
第三轮排序,从待排序序列中选取元素4,依次和已排序序列中元素比较,找到比4大的元素63,将4插入63之前,结束。
此时已排序序列为[3, 4, 4, 63]、待排序序列为[0, 1, 32, -2]。
第四轮排序,从待排序序列中选取元素0,依次和已排序序列中元素比较,找到比0大的元素3,将0插入3之前,结束。
此时已排序序列为[0, 3, 4, 4, 63]、待排序序列为[1, 32, -2]。
第五轮排序,从待排序序列中选取元素1,依次和已排序序列中元素比较,找到比1大的元素3,将1插入3之前,结束。
此时已排序序列为[0, 1, 3, 4, 4, 63]、待排序序列为[32, -2]。
第六轮排序,从待排序序列中选取元素32,依次和已排序序列中元素比较,找到比32大的元素63,将32插入63之前,结束。
此时已排序序列为[0, 1, 3, 4, 4, 32, 63]、待排序序列为[-2]。
第七轮排序,从待排序序列中选取元素-2,依次和已排序序列中元素比较,找到比-2大的元素0,将-2插入0之前,结束。
此时已排序序列为[-2, 0, 1, 3, 4, 4, 32, 63]、待排序序列为[]。
经过七轮排序后,待排序序列为空,排序结束。
代码
1 | public int[] sort(int[] array) { |
选择排序
排序思想
选择排序和插入排序看上去很像,都是从未排序的序列中选择一个元素,然后插入到已排序序列中。
不同之处在于选择排序是从待排序序列中选择一个最小的元素,然后将这个元素插入到已排序序列的最后。
这个方法的优点是,不需要频繁的在数组中移动数据,只需要两两交换即可。
具体可步骤为:
第一步:从待排序序列中通过比较,找到最小的元素,记录其位置和值。
第二步:将这个元素与待排序序列的第一个元素(也就是已排序序列最后元素的下一个元素)交换值。
重复上述两步,直到所有元素已排完。
代码
1 | public int[] sort(int[] array) { |