本文已参与[新人创作礼]活动,一起开启掘金创作之路。
今天开始呢,我们将从多个算法开始讲解,从最开始的算法思路,到算法伪代码实现,到复杂度分析,教你手把手搭建一个测试平台,根据你自身硬件水平可以对下列代码进行从1000,到千万级测试,其中算法测试时间与你的机器硬件水平和实现的算法有关系,下面我将从最简单的直接插入算法开始讲解。
(1)排序算法的思路并且举例说明
直接插入插排的基本思想是:当插入第i(i >= 1)时,前面的V[0],V[1],……,V[i-1]已经排好序。这时,用V[I]的排序码与V[i-1],V[i-2],…的排序码顺序进行比较,找到插入位置即将V[i]插入,原来位置上的元素向后顺移。
例如: 2 5 7 3 1
第一次排序: 2 5 7 3 1
第二次排序: 2 5 7 3 1
第一次排序: 2 3 5 7 1
第一次排序: 1 2 3 5 7
(2)算法伪代码
Insertion_sort(A){
for j←2 to length[A]{
temp = A[j];
i ←j-1;
}
while (i>0 and A[i] > temp){
A[i+1]=A[i];
i--;
A[i+1] = temp;
}
}
(3)复杂度分析
平均时间复杂度:O(n2)
最好时间复杂度:O(n) (原本序列有序)
最差时间复杂度:O(n2) (原本序列逆序)
空间复杂度:O(1)
稳定性:稳定
(4)代码主体部分
package runoob;
/**
* 插入排序
*/
public class InsertionSort {
public static void sort(Comparable[] arr){
int n = arr.length;
for (int i = 0; i < n; i++) {
// 寻找元素arr[i]合适的插入位置
for( int j = i ; j > 0 ; j -- )
if( arr[j].compareTo( arr[j-1] ) < 0 )
swap( arr, j , j-1 );
else
break;
}
}
private static void swap(Object[] arr, int i, int j) {
Object t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
public static void InsertionSort_text(long num) {
Integer[] arr = SortHelper.generateRandomArray(num, 0, 100);//函数随机生成工具
long start=System.nanoTime();
InsertionSort.sort(arr);
long end=System.nanoTime();
System.out.println("花费时间:" + (end - start) + "(ms)");
System.out.println("下面是排序好的数列");
SortHelper.printArray(arr);
}
}
对应代码中的SortHelper类我们留一个小小的悬念,留到最后来进行叙说,其中目前来说他的方法generateRandomArray的参数为,(num,left,right)第一个参数参与算法生成的数量级,作为随机生成序列,它可以为千万,因为是long级别,left和right则为生成序列的大小范围,生成的序列为返回值类型为Integer[]。
(5)测试结果如下:
因为直接插入算法的时间复杂度比较高,如果笔者有兴趣可以尝试千万级的算法测试,这里便不在赘述。