归并排序
本次使用递归实现归并排序,(我们采用倒序的思路),不妨先假设序列已经排序完毕,那么其之前一步就是将两部分(l->mid)以及(mid+1->r)进行排序然后合并…,那么依次按照这个思路我们就可以实现对应的递归方程式:
//边界条件
if(l>=r){
return;
}
int mid = (l+r)>>1;
//进行递归排序
merge_sort(nums,l,mid);
merge_sort(nums,mid+1,r);
然后定义一个临时数组tmp,用来存放将排完序的两部分合并成一个部分,依照这个思路我们便可以解决一下简单的算法题:
题目概述:
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
题目不让使用sort函数,那还不简单,直接用时间复杂度为O(nlogn)的归并排序来解决:
算法实现:
class Solution {
public void sortColors(int[] nums) {
merge_sort(nums,0,nums.length-1);
}
//实现归并排序
public void merge_sort(int[] nums,int l,int r){
if(l>=r){
return;
}
int mid = (l+r)>>1;
//进行递归排序
merge_sort(nums,l,mid);
merge_sort(nums,mid+1,r);
int i = l;
int j = mid+1;
int index = 0;
int[] tmp = new int[r-l+1];
while(i<=mid&&j<=r){
if(nums[i]<=nums[j]){
tmp[index++] = nums[i++];
}else{
tmp[index++] = nums[j++];
}
}
while(i<=mid){
tmp[index++] = nums[i++];
}
while(j<=r){
tmp[index++] = nums[j++];
}
int m = 0;
for(int n=l;n<=r;n++){
nums[n] = tmp[m++];
}
}
}