最近在看JAVA的一些排序算法,和大家分享一下,感觉非常有帮助~~为了简化,这里直接采用数组进行排序,没有引入比较策略。
为了便于测试,编写了一个生产数组的方法,如下:
/**
* 为排序生产测试数据
* @author Administrator
*
*/
public class NumberFactory {
/**
* 成产1个含有n个数的数组,每个数的大小在1-n之间
* @param n 数据的个数
* @return 生产的数组
*/
public static int[] buildNumber(int n){
int[] num = new int[n];
Random random = new Random();
for(int i = 0;i < num.length;i++){
num[i] = random.nextInt(n);
}
return num;
}
}
import java.util.Arrays;
/**
* 插入排序
* @author Administrator
*
*/
public class InsertSequenceTest {
/**
* 插入排序
* @param array
*/
public static void insertSequence(int array[]){
int j;
for(int i=0;i0&&p
import java.util.Arrays;
/**
* 希尔排序
* @author Administrator
*
*/
public class ShellsortSquenceTest {
/**
* 希尔排序
* @param array 代排序数组
*/
public static void shellsort(int array[]){
for(int shell = array.length/2;shell>0;shell/=2){//递减的增量
int j;
for(int i = shell;i= 0&&o < array[j-shell];j -= shell){
array[j] = array[j-shell];
}
array[j] = o;
}
}
}
}
import java.util.Arrays;
public class HeapSequenceTest {
/**
* 堆排序
* @param a
*/
public static void heapSort(int[] a){
for(int i = a.length/2; i >= 0; i--) //先建立堆
percolatedown(a,i,a.length);
for(int i = a.length-1; i >= 0; i--){//将头尾互换,建立堆
changeNum(a, 0, i);
percolatedown(a,0,i);
}
}
/**
* 建立堆主方法
* @param a
* @param begin 开始位置
* @param len 需要的总长度
*/
private static void percolatedown(int[] a, int begin, int len) {
int child; //与父亲交换位置的孩子
int temp = a[begin]; //用于存放变量
int j = 1;
for(; leftchild(begin) < len; begin = child){
child = leftchild(begin);
//如果存在右孩子,选择一个最小的
if(child+1 < len&& a[child] < a[child+1])
child++;
if(temp < a[child]){
a[begin] = a[child];
}
else
break;
j++;
}
a[begin] = temp;
}
/**
* 返回左孩子的下标
* @param begin
* @return
*/
private static int leftchild(int begin) {
return 2*begin+1;
}
/**
* 交换次序,该方法用于交换数组内两个下标的数字
* @param a 待交换的数组
* @param left 被交换的下标1
* @param center 被交换的下标2
*/
private static void changeNum(int[] a, int arg1, int arg2) {
int tem = a[arg1];
a[arg1] = a[arg2];
a[arg2] = tem;
}
public static void main(String[] args) {
int[] a = NumberFactory.buildNumber(19);
System.out.println("***********堆排序前**************");
System.out.println(Arrays.toString(a));
System.out.println("***********堆排序后**************");
HeapSequenceTest.heapSort(a);
System.out.println(Arrays.toString(a));
}
}
/**
* 归并排序
* @author Administrator
*
*/
public class MergeSequenceTest {
/**
* 引出归并排序
* @param a 待排序数组
*/
public static void mergeSort(int[] a){
int[] temp = new int[a.length];
mergeSort(a,temp,0,a.length-1);
}
/**
* 递归调用归并
* @param a 待排序数组
* @param temp 被拷贝的数组
* @param left 待排数组起始
* @param right 待排数组结尾
*/
private static void mergeSort(int[] a, int[] temp, int left, int right) {
if(left
package com.example.sequence;
import java.util.Arrays;
public class QuickSequenceTest {
/**
* 快速排序入口
* @param a
*/
public static void quickSort(int[] a){
quickSort(a,0,a.length-1);
}
/**
* 快速排序主方法
* @param a
* @param left
* @param right
*/
private static void quickSort(int[] a, int left, int right) {
if(left+1 < right){
//查找枢纽中值
int flag = findFlag(a,left,right);
int i = left, j = right-1;
for(;;){
while(a[++i] < flag){} //此行可看出快速排序的优势。
while(a[--j] > flag){} //相等也进行交换,防止递归不均匀
if(i