1、插入排序

假定有一个数组array = [a1,a2,a3,a4,a5....an];

使用插入排序代码如下(手敲代码,有可能无法运行,但是排序思想肯定是正确的):

//第一个循环时间耗费c1*array.length
for(int i=1;i<array.length;i++){
     var temp =array[i];
     int j=i-1;
     //第二个循环时间耗费c2*array.length
     while(j>=0&&array[j]>temp){
           array[j+1]=array[j];
           j=j-1;
     }
     array[j+1]=temp;
}

所以插入排序的运行时间为c1*array.length *c2*array.length 若 array.length 是n的话 对于n平方这个数,c1.c2常量可忽略。所以插入排序的运行时间记作θ(n²)

2、归并排序

假定有一个数组array = [a1,a2,a3,a4,a5....an];

public void start(int[] array,int left,int right){
   if(left<right){
       int middle =(left+right)/2;
       start(array,0,middle-1);
       start(array,middle+1,right);
       merge(array,left,middle,right);
    }
}
public void merge(int []a,int left,int middle,int right){
        int[] tempArray = new int[a.length];
        int rightstart = middle+1;
        int temp = left;
        int third = left;
        while (left<=middle&&rightstart<right){
            //一个一个往新的数组里边放值,遍历被分开的两个数组;
            //比较两个小数组相应下标位置的数字大小,小的先放进新数组;
            if(a[left]<=a[rightstart]){
                //比较左边第一个和右边第一个,然后把小的那一个放进到新数组;再将下标往后移动一位,继续比较;
                tempArray[third++] = a[left++];
            }else{
                tempArray[third++] = a[rightstart++];
            }
        }
        //如果左边还有数据需要拷贝,把左边数组剩下的拷贝到新数组;
        while (left<=middle){
            tempArray[third++] = a[left++];
        }
        //如果右边还有数据需要拷贝,就把右边数组剩下的拷贝到新数组;
        while (rightstart<=right){
            tempArray[third++] = a[rightstart++];
        }
        while (temp<=right){
            a[temp] = tempArray[temp++];
        }
}

归并排序的运行时间需要借助递归树,所以这里直接列出结果为θ(nlgn)

所以归并排序随着n的增长,其运行时间是大大小于插入排序的。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注