本文首发于我的博客html
本系列排序包括十大经典排序算法。git
Sort
里面实现了,交换,大小比较等方法。例如交换两个值,直接传入下标就能够了。其余的具体排序的类都继承抽象类Sort
。这样咱们就能专一于算法自己。/*
* 返回值等于0,表明 array[i1] == array[i2]
* 返回值小于0,表明 array[i1] < array[i2]
* 返回值大于0,表明 array[i1] > array[i2]
*/
protected int cmp(int i1, int i2) {
return array[i1].compareTo(array[i2]);
}
protected int cmp(T v1, T v2) {
return v1.compareTo(v2);
}
protected void swap(int i1, int i2) {
T tmp = array[i1];
array[i1] = array[i2];
array[i2] = tmp;
}
复制代码
每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到所有插入完为止。github
思路:第一种方案是每次比较。若是后面的比前面的小。就交换位置。算法
package YZ.Sort;
public class InsertionSort1<T extends Comparable<T>> extends Sort<T> {
@Override
protected void sort() {
// TODO Auto-generated method stub
for (int begin = 1; begin < array.length; begin++) {
int cur = begin;
while (cur>0 && cmp(array[cur],array[cur-1])<0) {
swap(cur, cur-1);
cur--;
}
}
}
}
复制代码
思路:将 交换 改成 挪动数组
public class InsertionSort2<T extends Comparable<T>> extends Sort<T> {
@Override
protected void sort() {
for (int begin = 1; begin < array.length; begin++) {
int cur = begin;
T res =array[cur];
while (cur>0 && cmp(res,array[cur-1])<0) {
array[cur] = array[cur-1];
cur--;
}
array[cur] = res;
}
}
}
复制代码
前面的代码中,想要插入一个元素,是经过逐个比较来寻找要插入的位置。其实能够经过二分法来更快速的查找位置。bash
public class InsertionSort3 <T extends Comparable<T>> extends Sort<T> {
@Override
protected void sort() {
// TODO Auto-generated method stub
for (int begin = 1; begin < array.length; begin++) {
insert(begin, searchIndex(begin));
}
}
/**
* 将source位置的元素插入到dest位置
* @param source
* @param dest
*/
private void insert(int source,int dest) {
T v = array[source];
for (int i = source; i > dest; i--) {
array[i] = array[i-1];
}
array[dest] = v;
}
/**
* 利用二分搜索找到 index 位置元素的待插入位置
* 已经排好序数组的区间范围是 [0, index)
* @param index
* @return
*/
private int searchIndex(int index) {
int begin = 0;
int end = index;
while (begin<end) {
int mid = (begin+end)>>1;
if (cmp(array[index], array[mid])<0) {
end = mid;
}else {
begin = mid +1;
}
}
return begin;
}
}
复制代码
数据源:从1到20000之间随机生成10000个数据来测试dom
Integer[] array = Integers.random(10000, 1, 20000);ide
结果以下:post
【BubbleSort】 稳定性:true 耗时:0.481s(481ms) 比较次数:4999.50万 交换次数:2467.42万性能
【BubbleSort1】 稳定性:true 耗时:0.428s(428ms) 比较次数:4998.82万 交换次数:2467.42万
【BubbleSort2】 稳定性:true 耗时:0.405s(405ms) 比较次数:4993.60万 交换次数:2467.42万
【InsertionSort1】 稳定性:true 耗时:0.239s(239ms) 比较次数:2468.42万 交换次数:2467.42万
【InsertionSort2】 稳定性:true 耗时:0.186s(186ms) 比较次数:2468.42万 交换次数:0
【InsertionSort3】 稳定性:true 耗时:0.114s(114ms) 比较次数:11.90万 交换次数:0
【HeapSort】 稳定性:false 耗时:0.005s(5ms) 比较次数:23.53万 交换次数:9999