手把手搭建千万级Java算法测试-插入排序

161 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

今天开始呢,我们将从多个算法开始讲解,从最开始的算法思路,到算法伪代码实现,到复杂度分析,教你手把手搭建一个测试平台,根据你自身硬件水平可以对下列代码进行从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)测试结果如下:

图片.png

因为直接插入算法的时间复杂度比较高,如果笔者有兴趣可以尝试千万级的算法测试,这里便不在赘述。