归并排序
算法步骤:
- 确定分界点 mid = (l+r) / 2;
- 递归排序 left与right;
- 归并–合二为一
知识点:稳定排序与不稳定排序,没什么用
- 稳定排序算法:两个相等的数在排序后前后位置没有交换。常见的稳定排序算法:冒泡排序,插入排序,归并排序,基数排序
- 不稳定排序算法:与上面的相反。常见的不稳定排序算法:选择排序,快速排序,希尔排序,堆排序
双指针算法
import java.util.*;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
public static void sort(int[] nums,int begin, int end){
if(begin >= end) return;
int mid = begin+(end-begin)/2;
sort(nums,begin,mid);
sort(nums,mid+1,end);//首先把数组划分为一个一组的
int[] temp = new int[end-begin+1];//创建一个临时数组用于临时保存结果
int i = begin,j = mid+1;
int k = 0;
while(i <= mid && j <= end){
if(nums[i] <=nums[j]){
temp[k++] = nums[i];
i++;
}
if(nums[i] > nums[j]){
temp[k++] = nums[j];
j++;
}
}//对左右两个有序数组进行排序
while(i <= mid){
temp[k++] = nums[i++];
}
while(j <= end){
temp[k++] = nums[j++];
}//将排序后剩余的数组拼接至当前数组之后
for(int a = begin,b=0; a <= end; a++,b++){
nums[a] = temp[b];
}//将排序后的数组赋值给原数组
}
public static void main(String[] args) throws IOException{
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.valueOf(buffer.readLine());
int[] nums = new int[n];
String temp = buffer.readLine();
String[] temp_ar = temp.split(" ");
for(int i = 0; i < n; i++){
nums[i] = Integer.valueOf(temp_ar[i]);
}
sort(nums,0,n-1);
for(int i = 0; i < n; i++){
System.out.print(nums[i] + " ");
}
}
}