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++];
}
}

浙公网安备 33010602011771号