算法思想
归并排序利于分治法的思想,在待排序序列选取位于中间位置的元素将序列一分为二,然后再对这两部分分别排序,最后将两部分合并,合并后的序列为已排序序列。
分的过程:设序列长度为N,则以(N-1)/2位置的元素为分界线,将队列分为两部分:位置从0到(N-1)/2的元素为一部分、位置从((N-1)/2)+1到N-1的元素为一部分(或者0到((N-1)/2-1)为一部分,(N-1)/2到N-1为一部分)。
合的过程:比较两个队列(两个队列已各自排好序)的队首元素,将小的从该队列中移除并插入到新队列的第一个位置,然后在比较两队列的首元素大小,将小的从该队列移除并将其添加到新队列上次添加的元素的后面,重复上述步骤直到有一个队列为空。最后将不为空的队列剩下所有的元素依次添加到新队列的最后,新队列则为一个已排序的队列。
排序示例
对序列{3, 4, 63, 2, -9, 0, 1, 32, -2}进行排序。
首先,将序列分为两个序列:{3, 4, 63, 2, -9}、{0, 1, 32, -2},然后分别对两个序列排序。
对序列{3, 4, 63, 2, -9}排序过程为:
- 分割序列,得到两个序列{3, 4, 63}、{2, -9}。
- 分割序列 {3, 4, 63},得到两个待排序序列{3, 4}、{63}。
- 分割序列 {3, 4},得到两个待排序序列 {3}、{4}。
- 两个待排序序列只有一个元素,分割结束。
- 合并序列 {3}、{4},得到已排序序列 {3, 4}。
- 序列 {63} 只有一个元素,分割介绍。
- 合并序列 {3, 4}、{63},得到已排序序列 {3, 4, 63}。
- 分割序列 {3, 4},得到两个待排序序列 {3}、{4}。
- 分割序列 {2, -9},得到两个待排序序列 {2}、{-9}。
- 两个待排序序列只有一个元素,分割结束。
- 合并序列 {2}、{-9},得到已排序序列 {-9, 2}。
- 合并序列 {3,4,63}、{-9, 2},得到已排序序列 {-9, 2, 3, 4, 63}。
对序列 {0, 1, 32, -2}排序过程不再展示。
最后将得到的两个已排序序列{-9, 2, 3, 4, 63}、{-2, 0, 1, 32}合并后得到最终排序序列{-9, -2, 0, 1, 2, 3, 4, 32, 63}
代码
1 | public int[] sort(int[] array) { |
代码地址:github