归并排序是一种分治的排序算法,他将一个数组分成两个子数组将两部分独立的排序,然后再合并。
快速排序是分治的排序算法,不过他讲两个子数组排序好后整个数组已经是排好序的了;
思路:
1.选取一个键值,一般取第一位
2.用两个指针i,j一个从前面,一个从后面循环遍历后面的数组,若i指针发现比第一个大的,j指针发现比第一个数小的交换他们两个
3.递归分别将左右数组排序
//文件名 :Demo.java
import java.lang.*;
import java.util.Arrays;
import java.util.Scanner;
import java.io.*;
import java.math.*;
public class Demo{
// sort template
private static Comparable[] aux;
private static void sort(Comparable[] a,int lo,int hi){
//将数组a[lo..hi]排序
if(lo >= hi) return;
int j = partition(a, lo, hi);
sort(a, lo, j-1);
sort(a, j+1, hi);
}
private static int partition(Comparable[] a,int lo, int hi){
int i = lo, j = hi+1;
Comparable v = a[lo];
while(true){
while(less(a[++i],v)) if(i == hi) break;
while(less(v,a[--j])) if(i == lo)break;
if(i >= j)break;
exch(a,lo,j);
}
exch(a,lo,j);
return j;
}
public static void merge(Comparable[] a,int lo,int mid,int hi){
//原地归并 就是将一个大数组分成两个有序的数组
//再逐个对比数组值大小 将小的放回原数组
int i = lo, j = mid +1;//i,j 识别自己的数组的位置
for(int k = lo; k <= hi; k++){
aux[k] = a[k];//复制一份 a数组 给 aux
}
for(int k = lo; k <= hi;k++){
//可能有四种状况
if(i > mid) a[k] = aux[j++];//1.左半边用完
else if(j > hi) a[k] = aux[i++];//2.右半边用完
else if(less(aux[j], aux[i])) a[k] = aux[j++];//左边的大于右边 取右边的
else a[k] = aux[i++]; //左边的小于右边的 取 左边的
//比较大小时去的都是小的
}
}
private static void exch(Comparable[] a,int i,int j){
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static boolean less(Comparable a,Comparable b){
return a.compareTo(b) < 0;
}
public static void show(Comparable[] a){
for(int i = 0; i < a.length; i++){
System.out.println(a[i]+" ");
}
}
public static boolean isSorted(Comparable[] a){
for(int i = 1; i < a.length; i++){
if(less(a[i],a[i-1])){
return false;
}
}
return true;
}
public static void main(String[] args) {
Comparable[] a = {3,1,5,7,9,4,6,1,34,4};
Comparable[] b = {12,11,10,9,8,7,6,5,4,3,2,1};
// sort(a);
sort(b,0,b.length-1);
show(b);
}
}