2排序算法初步

二排序算法及分析

1 主要内容

  • 排序问题
  • 插入排序
  • 合并排序
  • 递归式
  • 算法分析

2 插入排序

 public static void insertSort(int[] array){
        for (int i=1;i<array.length;i++){
            int insertValue=array[i];
            int j=i-1;
            //从右向左比较元素的同时,进行元素复制
            for (;(j>=0)&&(insertValue<array[j]);j--){
                array[j+1]=array[j];
            }
            //insertValue的值插入适当位置
            array[j+1]=insertValue;
        }
    }
  • 最坏时间复杂度Θ(n2)

3 合并排序

  • 把大组不断对半分,分成小组,直到只剩两个,然后两两对比排序,最后归并成大组
  • 归并操作需要三步
  • 第一步:创建一个额外的大集合,用于存储归并结果,长度是两个小集合之和
  • 第二步:从左到右逐一比较两个小集合中的元素,把较小的元素优先放入大集合
  • 第三步:从另一个还有剩余元素的集合中,把剩余元素按顺序复制到大集合尾部
  • 归并排序时间复杂度是O(nlogn),空间复杂度是O(n),是稳定的
public static void mergerSort(int[] array, int start, int ent){
    if(start<end){
        //折半拆成两个小集合,分别进行扫描
        int mid=(start+end)/2;
        mergeSort(array,start,mid);
        mergeSort(array,mid+1,end);
        //把两个有序小集合,归并成一个大集合
        merge(array,start,mid,end);
    }
}
private static void merge(int[] array,int start,int mid,int end){
        //开辟额外大集合,设置指针
        int[] tempArray=new int[end-start+1];
        int p1=start;
        int p2=mid+1;
        int p=0;
        //比较两个小集合的元素,依次放入大集合
        while ((p1<=mid) && (p2<=end)){
            if (array[p1]<=array[p2]){
                tempArray[p++]=array[p1++];
            }
            else {
                tempArray[p++]=array[p2++];
            }
        }
        //左侧小集合还有剩余,依次放入大集合尾部
        while (p1<=mid){
            tempArray[p++]=array[p1++];
        }
        //右侧小集合还有剩余,依次放入大集合尾部
        while (p2<=end){
            tempArray[p++]=array[p2++];
        }
    }
posted @ 2021-10-16 18:30  fao99  阅读(30)  评论(0)    收藏  举报