MySort.java
package cn.edu.wtu.sort;
public class MySort {
/**
* 冒泡排序
*
* @param a
*/
public static void bubble(int a[]) {
for (int i = 0; i < a.length; ++i) {
for (int j = 1; j < a.length - i; ++j) {
if (a[j] < a[j - 1]) {
a[j] ^= a[j - 1];
a[j - 1] ^= a[j];
a[j] ^= a[j - 1];
}
}
}
}
/**
* 插入排序,认为第一个数是有序的,依次插入其他数 使用插入排序数组第零号最好不要存储数据
*
* @param a
*/
public static void insertSort(int a[]) {
for (int i = 1; i < a.length; ++i) {
int tmp = a[i], j;
for (j = i; j > 0 && tmp < a[j - 1]; --j) {
a[j] = a[j - 1];
}
a[j] = tmp;
}
}
/**
* 插入排序 第零号元素不存数据
*
* @param a
*/
public static void insertSort1(int a[]) {
for (int i = 2, j; i < a.length; ++i) {
a[0] = a[i];
for (j = i; a[0] < a[j - 1]; --j) {
a[j] = a[j - 1];
}
a[j] = a[0];
}
}
/**
* 快速排序
*
* @param a
*/
public static void QSort(int a[]) {
QSort(a, 0, a.length - 1);
}
private static void QSort(int a[], int low, int high) {
if (low < high) {
int pivot = Partation(a, low, high);
QSort(a, low, pivot - 1);
QSort(a, pivot + 1, high);
}
}
private static int Partation(int[] a, int low, int high) {
while (low < high) {
while (low < high && a[low] <= a[high]) {
--high;
}
/** 交换两数 此处不能使用位运算 因为当low与high相等时a[low]=a[high]=0 */
int tmp = a[low];
a[low] = a[high];
a[high] = tmp;
while (low < high && a[low] <= a[high]) {
++low;
}
tmp = a[low];
a[low] = a[high];
a[high] = tmp;
}
return low;
}
/**
* 希尔排序
*
* @param a
*/
public static void shellSort(int a[]) {
int b[] = { 5, 3, 1 };
for (int i = 0; i < b.length; ++i) {
shellSort(a, b[i]);
}
}
private static void shellSort(int a[], int dk) {
int i, j;
for (i = dk; i < a.length; i += dk) {
int tmp = a[i];
for (j = i - dk; j >= 0 && a[j] > tmp; j -= dk) {
a[j + dk] = a[j];
}
a[j + dk] = tmp;
}
}
/**
* 堆排序
*
* @param a
*/
public static void heapSort(int a[]) {
for (int i = a.length / 2 - 1; i >= 0; --i) {
// 构造初始堆(构建一个完全二叉树,保证所有的父结点都比它的孩子结点数值大
heapAdjust(a, i, a.length - 1);
}
// 每次交换第一个和最后一个元素,输出最后一个元素(最大值),然后把剩下元素重新调整为大根堆。
// 当输出完最后一个元素后,这个数组已经是按照从小到大的顺序排列了。
for (int i = a.length - 1; i > 0; --i) {
a[0] ^= a[i];
a[i] ^= a[0];
a[0] ^= a[i];
heapAdjust(a, 0, i);
}
}
private static void heapAdjust(int a[], int i, int n) {
int child = 2 * i + 1;
int tmp = a[i];
while (child < n) {
if (child < n - 1 && a[child] < a[child + 1]) {
++child;
}
if (tmp >= a[child]) {
break;
}
a[i] = a[child];
i = child;
child = 2 * child + 1;
}
a[i] = tmp;
}
/**
* 归并排序
*
* @param a
*/
public static void mergeSort(int a[]) {
int tmp[] = new int[a.length];
mergeSort(a, 0, a.length - 1, tmp);
}
private static void mergeSort(int a[], int first, int last, int tmp[]) {
if (first < last) {
int mid = (first + last) / 2;
mergeSort(a, first, mid, tmp);
mergeSort(a, mid + 1, last, tmp);
mergeArray(a, first, mid, last, tmp);
}
}
/* 数组合并 */
private static void mergeArray(int a[], int first, int mid, int last, int tmp[]) {
int i = first;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= last) {
if (a[i] < a[j]) {
tmp[k++] = a[i++];
} else {
tmp[k++] = a[j++];
}
}
while (i <= mid) {
tmp[k++] = a[i++];
}
while (j <= last) {
tmp[k++] = a[j++];
}
for (i = 0; i < k; ++i) {
a[first + i] = tmp[i];
}
}
/**
* 基数排序
*
* @param a
*/
public static void radixSort(int a[]) {
int n = getMaxLength(a);
int i = 1;
while (n-- != 0) {
sortByDigit(a, i);
i *= 10;
}
}
/* 根据digit位排序,这里使用的是冒泡,可改用其它 */
private static void sortByDigit(int a[], int digit) {
for (int i = 0; i < a.length; ++i) {
for (int j = 1; j < a.length - i; ++j) {
if (getDigit(a[j - 1], digit) > getDigit(a[j], digit)) {
a[j - 1] ^= a[j];
a[j] ^= a[j - 1];
a[j - 1] ^= a[j];
}
}
}
}
/* 得到数组的最大位数 */
private static int getMaxLength(int a[]) {
int max = 0;
for (int i = 0; i < a.length; ++i) {
if (max < getLength(a[i])) {
max = getLength(i);
}
}
return max;
}
/* 得到位数 一种数学方法得到 一种利用java类型转换得到 */
private static int getLength(int n) {
int m = 0;
while (n % 10 != 0) {
m++;
n /= 10;
}
return m;
// return String.valueOf(n).length();
}
/* 得到digit位上的数字 */
private static int getDigit(int n, int digit) {
return n / digit % 10;
}
/*
* 选择排序
*/
public static void selectSort(int a[]){
for( int i = 0 ; i < a.length; ++i ){
int min = a[i];
int index = i ;
for( int j = i+1 ; j < a.length; ++j){
if(min >a[j]){
min = a[j];
index = j;
}
}
a[index] = a[i];
a[i] = min;
}
}
}
Utils.java
package cn.edu.wtu.utils;
import java.util.Random;
public class Utils {
//得到一个随机数组,
public static int [] getArray(int n){
int a[] = new int[n];
Random ran=new Random();
for( int i = 0 ; i < n ; ++i ){
a[i] = ran.nextInt(100); //产生100以内的整数
}
return a;
}
public static void print( int a[] ){
for( int i=0; i<a.length; ++i){
System.out.print(a[i]+" ");
}
System.out.println();
}
}
Test.java
package cn.edu.wtu.test;
import java.util.Arrays;
import cn.edu.wtu.sort.MySort;
import cn.edu.wtu.utils.Utils;
public class Test {
public static void main(String[] args) {
int n = 20; //产生数组的大小
int a[] = Utils.getArray(n);
Utils.print(a);
//直接调用Arrays的sort方法排序
Arrays.sort(a);
//MySort.bubble(a);
//MySort.insertSort(a);
//MySort.QSort(a);
//MySort.shellSort(a);
//MySort.heapSort(a);
//MySort.mergeSort(a);
//MySort.radixSort(a);
//MySort.selectSort(a);
Utils.print(a);
}
}