package temp;
import sun.misc.Sort;
/**
* @author zengjl
* @version 1.0
* @since 2007-08-22
* @Des java几种基本排序方法
*/
/**
* SortUtil:排序方法
* 关于对排序方法的选择:这告诉我们,什么时候用什么排序最好。当人们渴望先知道排在前面的是谁时,
* 我们用选择排序;当我们不断拿到新的数并想保持已有的数始终有序时,我们用插入排序;当给出的数
* 列已经比较有序,只需要小幅度的调整一下时,我们用冒泡排序。
*/
public class SortUtil extends Sort {
/**
* 插入排序法
* @param data
* @Des 插入排序(Insertion Sort)是,每次从数列中取一个还没有取出过的数,并按照大小关系插入到已经取出的数中使得已经取出的数仍然有序。
*/
public int[] insertSort(int[] data) {
int temp;
for (int i = 1; i < data.length; i++) {
for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {
swap(data, j, j - 1);
}
}
return data;
}
/**
* 冒泡排序法
* @param data
* @return
* @Des 冒泡排序(Bubble Sort)分为若干趟进行,每一趟排序从前往后比较每两个相邻的元素的大小(因此一趟排序要比较n-1对位置相邻的数)并在
* 每次发现前面的那个数比紧接它后的数大时交换位置;进行足够多趟直到某一趟跑完后发现这一趟没有进行任何交换操作(最坏情况下要跑n-1趟,
* 这种情况在最小的数位于给定数列的最后面时发生)。事实上,在第一趟冒泡结束后,最后面那个数肯定是最大的了,于是第二次只需要对前面n-1
* 个数排序,这又将把这n-1个数中最小的数放到整个数列的倒数第二个位置。这样下去,冒泡排序第i趟结束后后面i个数都已经到位了,第i+1趟实
* 际上只考虑前n-i个数(需要的比较次数比前面所说的n-1要小)。这相当于用数学归纳法证明了冒泡排序的正确性
*/
public int[] bubbleSort(int[] data) {
int temp;
for (int i = 0; i < data.length; i++) {
for (int j = data.length - 1; j > i; j--) {
if (data[j] < data[j - 1]) {
swap(data, j, j - 1);
}
}
}
return data;
}
/**
* 选择排序法
* @param data
* @return
* @Des 选择排序(SelectionSort)是说,每次从数列中找出一个最小的数放到最前面来,再从剩下的n-1个数中选择一个最小的,不断做下去。
*/
public int[] chooseSort(int[] data) {
int temp;
for (int i = 0; i < data.length; i++) {
int lowIndex = i;
for (int j = data.length - 1; j > i; j--) {
if (data[j] < data[lowIndex]) {
lowIndex = j;
}
}
swap(data, i, lowIndex);
}
return data;
}
/**
* 关于Shell排序讲解 Shell排序算法依赖一种称之为“排序增量”的数列,不同的增量将导致不同的效率。
* 假如我们对20个数进行排序,使用的增量为1,3,7。那么,我们首先对这20个数进
* 行“7-排序”(7-sortedness)。所谓7-排序,就是按照位置除以7的余数分组进行
* 排序。具体地说,我们将把在1、8、15三个位置上的数进行排序,将第2、9、16个 数进行排序,依此类推。这样,对于任意一个数字k,单看A(k),
* A(k+7), A(k+14),... 这些数是有序的。7-排序后,我们接着又进行一趟3-排序(别忘了我们使用的排序增量
* 为1,3,7)。最后进行1-排序(即普通的排序)后整个Shell算法完成。
*/
/**
* shell排序法
*
* @param data
* @return
*/
public int[] shellSort(int[] data) {
for (int i = data.length / 2; i > 2; i /= 2) {
for (int j = 0; j < i; j++) {
shellInsertSort(data, j, i);
}
}
shellInsertSort(data, 0, 1);
return data;
}
/**
* shell排序“排序增量”方法
*
* @param data
* @param start
* @param inc
*/
public void shellInsertSort(int[] data, int start, int inc) {
int temp;
for (int i = start + inc; i < data.length; i += inc) {
for (int j = i; (j >= inc) && (data[j] < data[j - inc]); j -= inc) {
swap(data, j, j - inc);
}
}
}
/**
* 快速排序法
*
* @param data
* @return
*/
private static int MAX_STACK_SIZE = 4096;
private static int THRESHOLD = 10;
public int[] quickSort(int[] data) {
int[] stack = new int[MAX_STACK_SIZE];
int top = -1;
int pivot;
int pivotIndex, l, r;
stack[++top] = 0;
stack[++top] = data.length - 1;
while (top > 0) {
int j = stack[top--];
int i = stack[top--];
pivotIndex = (i + j) / 2;
pivot = data[pivotIndex];
swap(data, pivotIndex, j);
// partition
l = i - 1;
r = j;
do {
while (data[++l] < pivot)
;
while ((r != 0) && (data[--r] > pivot))
;
swap(data, l, r);
} while (l < r);
swap(data, l, r);
swap(data, l, j);
if ((l - i) > THRESHOLD) {
stack[++top] = i;
stack[++top] = l - 1;
}
if ((j - l) > THRESHOLD) {
stack[++top] = l + 1;
stack[++top] = j;
}
}
// 插入排序
insertSort(data);
return data;
}
/**
* 归并排序法
*
* @param data
* @return
*/
public int[] improvedMergeSort(int[] data) {
int[] temp = new int[data.length];
mergeSort(data, temp, 0, data.length - 1);
return data;
}
/**
* 合并排序
* @param data
* @param temp
* @param l
* @param r
*/
private void mergeSort(int[] data, int[] temp, int l, int r) {
int i, j, k;
int mid = (l + r) / 2;
if (l == r)
return;
if ((mid - l) >= THRESHOLD)
mergeSort(data, temp, l, mid);
else
insertSort(data, l, mid - l + 1);
if ((r - mid) > THRESHOLD)
mergeSort(data, temp, mid + 1, r);
else
insertSort(data, mid + 1, r - mid);
for (i = l; i <= mid; i++) {
temp[i] = data[i];
}
for (j = 1; j <= r - mid; j++) {
temp[r - j + 1] = data[j + mid];
}
int a = temp[l];
int b = temp[r];
for (i = l, j = r, k = l; k <= r; k++) {
if (a < b) {
data[k] = temp[i++];
a = temp[i];
} else {
data[k] = temp[j--];
b = temp[j];
}
}
}
private void insertSort(int[] data, int start, int len) {
for (int i = start + 1; i < start + len; i++) {
for (int j = i; (j > start) && data[j] < data[j - 1]; j--) {
swap(data, j, j - 1);
}
}
}
/**
* 交换数据顺序
*
* @param data
* @param i
* @param j
*/
private void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
public static void main(String[] args){
int[] data = {-2,1,2,4,2,0,4,555,3,99};
SortUtil sort = new SortUtil();
System.out.println(System.currentTimeMillis());
data = sort.bubbleSort(data) ;
String str = "" ;
for(int i = 0 ; i < data.length ; i ++ ){
str = str + data[i]+",";
}
System.out.println(str);
System.out.println(System.currentTimeMillis());
}
}