1、快速排序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class quickSort {
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(buf.readLine());
String []nums = buf.readLine().split(" ");
int []a = new int[n];
for (int i = 0; i < nums.length; i++) {
a[i] = Integer.valueOf(nums[i]);
}
quick_sort(a, 0, n - 1);
for (int i = 0; i < n; i++) {
System.out.print(a[i]+" ");
}
buf.close();
}
private static void quick_sort(int[]a, int l, int r){
if(l>=r){
return;
}
int x = a[l];
int i = l-1;
int j = r+1;
while(i<j){
do{
i++;
}while(a[i]<x);
do{
j--;
}while(a[j]>x);
if(i<j){
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
quick_sort(a , l , j);
quick_sort(a, j+1 , r);
}
}
ps:如果算法超出了时间限制,将x设置为a[l+r>>1]即可
2、归并排序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class margeSort {
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(buf.readLine());
String[] a = buf.readLine().split(" ");
int q[] = new int[n];
for(int i = 0;i<n;i++){
q[i] = Integer.valueOf(a[i]);
}
marge_sort(q , 0 , n-1);
for (int i = 0; i < q.length; i++) {
System.out.println(q[i]);
}
}
public static void marge_sort(int []q ,int l ,int r){
if(l>=r){
return;
}
int mid = l+r>>1;
marge_sort(q , l , mid);
marge_sort(q , mid+1 , r);
int k = 0;
int i = l;
int j = mid+1;
int temp[] = new int[r-l+1];
while(i<=mid && j<=r){
if(q[i]>q[j]){
temp[k++] = q[j++];
}else{
temp[k++] = q[i++];
}
}
while(i<=mid){
temp[k++] = q[i++];
}
while(j<=r){
temp[k++] = q[j++];
}
for(int x = l,w = 0;x<=r;x++,w++){
q[x] = temp[w];
}
}
}
归并排序模板步骤:
1、设置返回语句
2、取到中间值
3、递归左边,递归右边
4、设置临时数组,临时数组指针,目标数组的两个指针
5、比较两个数组元素大小,然后将数组剩下的元素拼接到临时数组中
6、将临时数组的元素返回到数组中
归并排序详解:归并排序即先递归后合并,是在递归完成之后,返回时对数组进行操作,初学者比较难理解,所以这里举一个简单的例子帮助理解。
假设有六个数:1、5、4、6、3、2
先层层递归到最下方,然后return,这时开始层层合并,每一层都会将两个区间内的数字重新排列,到最后一层时候,数组已经被排成了两个有序数组。
第一次合并时,1、5排序,6、3排序,依次类推,层层合并。