1.选择排序
private static void sort(int[] a) {
int min;
for(int i=0;i<a.length-1;i++){
min=i;
for(int j=i+1;j<a.length;j++){
if(esUtils.less(a[j], a[min])){
min=j;
}
}
esUtils.exchange(a, min, i);
}
}
2.插入排序
private static void sort(int[] a) {
for(int i=0;i<a.length-1;i++){
for(int j=i+1;j>0&&esUtils.less(a[j], a[j-1]);j--){
esUtils.exchange(a, j-1, j);
}
}
}
3.希尔排序
private static void sort(int[] a) {
int len=a.length;
int h=1;
while(h<len/3) h=h*3+1;
while(h>=1){
for(int i=h;i<len;i++){
for(int j=i;j>=h&&esUtils.less(a[j], a[j-h]);j-=h){
esUtils.exchange(a, j-h, j);
}
}
h=h/3;
}
}
4.自顶向下的归并排序
private static void sort(int[] a, int lo, int hi) {
if (hi <= lo)
return;
int mid = lo + (hi - lo) / 2;
sort(a, lo, mid);
sort(a, mid + 1, hi);
merge(a, lo, mid, hi);
}
private static void merge(int[] a, int lo, int mid, int hi) {
int i=lo,j=mid+1;
int[] aux=new int[len];
for(int k=lo;k<=hi;k++)
aux[k]=a[k];
for(int k=lo;k<=hi;k++){
if(i>mid) a[k]=a[j++];
else if(j>hi) a[k]=a[i++];
else if(esUtils.less(a[j], a[i]))
a[k]=a[j++];
else a[k]=a[i++];
}
}
5.自下向上的归并排序
private static void sort(int[] a) {
for (int sz = 1; sz < len; sz = sz + sz) {
for (int lo = 0; lo < len - sz; lo += sz + sz) {
merge(a, lo, lo + sz - 1, Math.min(len - 1, sz + sz + lo - 1));
}
}
}
private static void merge(int[] a, int lo, int mid, int hi) {
int i = lo, j = mid+1;
int[] aux = new int[len];
for (int k = lo; k <= hi; k++)
aux[k] = a[k];
for (int k = lo; k <= hi; k++) {
if (i > mid)
a[k] = a[j++];
else if (j > hi)
a[k] = a[i++];
else if (esUtils.less(a[j], a[i]))
a[k] = a[j++];
else
a[k] = a[i++];
}
}
ps:
几个函数
package 归并排序;
import java.util.Random;
public class esUtils {
long t = 0;
public esUtils() {
t = System.currentTimeMillis();
}
/**
* 返回从创建对象到调用此方法经过的时间
*/
public void end() {
long end = System.currentTimeMillis();
System.out.println(end - t + "毫秒");
}
/**
* 判断是否是有序的
*
* @param a
*/
public static void isSort(int[] a) {
for (int i = 0; i < a.length - 1; i++) {
if (a[i] > a[i + 1]) {
System.out.println("错误->" + i);
return;
}
}
}
/**
* 得到一个len长度的数组
*
* @param len
* 数组长度
* @return 返回数组
*/
public static int[] getArray(int len) {
int[] a = new int[len];
for (int i = 0; i < len; i++) {
int t = new Random().nextInt(len);
a[i] = t;
}
return a;
}
/**
* 第一个数比第二个小,返回真
*
* @param a
* 数字1
* @param b
* 数字2
* @return 比较结果
*/
public static boolean less(int a, int b) {
if (a < b)
return true;
return false;
}
/**
* 交换两个数
*
* @param a
* 所在数组
* @param i
* 索引1
* @param j
* 索引2
*/
public static void exchange(int[] a, int i, int j) {
if (i == j)
return;
int t = a[i];
a[i] = a[j];
a[j] = t;
}
/**
* 输出这个数组
*
* @param a
* 数组
*/
public static void putArray(int[] a) {
int len = 1;
System.out.println("数组如下");
for (int i : a) {
System.out.print(i + "\t");
if (len % 10 == 0) {
System.out.println();
len = 0;
}
len++;
}
System.out.println("\n--------------------------");
}
}