冒泡,选择,插入,希尔,快速,归并
import java.text.SimpleDateFormat;
import java.util.Date;
public class SortTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = SortTest.create(440000);
// int[] arr = {25,222,88,100,122,33,66};
Date date =new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
String dateStr = simpleDateFormat.format(date);
System.out.println("排序前的时间是:" + dateStr);
// SortTest.show(arr);
SortTest.mergeSort(arr, 0, arr.length - 1, new int[arr.length]);
// SortTest.quickSort(arr,0,arr.length - 1);
// SortTest.selectSort(arr);
Date date2 =new Date();
String dateStr2 = simpleDateFormat.format(date2);
System.out.println("排序后的时间是:" + dateStr2);
// SortTest.show(arr);
}
//生成一个随机数组
public static int[] create(int n){
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = (int)(Math.random() * 900000);
}
return arr;
}
//冒泡排序
public static int[] bubbleSort(int[] arr){
if(arr == null){
return null;
}
int temp;
for(int i = 1; i < arr.length; i++){
for(int j = 0; j < arr.length - i; j++){
if(arr[j] > arr[j + 1]){ //从小到大排
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
//选择排序
public static int[] selectSort(int[] arr){
if(arr == null){
return null;
}
int temp;
int index;
for(int i = 0; i < arr.length-1; i++){
temp = arr[i];
index = i;
for(int j =i + 1; j < arr.length; j++){ //从第i+1个数开始,挑选出最小的与第i个数交换
if(arr[j] < temp){ //从小到大排
temp = arr[j];
index = j;
}
}
if(index != i){
arr[index] = arr[i];
arr[i] = temp;
}
}
return arr;
}
//插入排序
public static int[] insertSort(int[] arr){
int temp;
for(int i = 1; i < arr.length; i++){//前i个数是有序的,将第i个数插入到前面有序的数中
temp = arr[i];
int j = i;
while(j > 0 && temp < arr[j-1]){
arr[j] = arr[j - 1];//后移一位
j--;
}
arr[j] = temp;
}
return arr;
}
//希尔排序
public static int[] shellSort(int[] arr){
for(int gap = arr.length/2; gap > 0; gap /= 2){
for(int i = gap; i < arr.length; i++){
int j = i;
int temp = arr[j];
if(arr[j] < arr[j - gap]){
while(j - gap >= 0 && temp < arr[j - gap]){
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}
return arr;
}
//快速排序
public static int[] quickSort(int[] arr, int left, int right){
int l = left;
int r = right;
int pivot = arr[(l + r) / 2];
int temp;
while(l < r){
while(arr[l] < pivot){//从左开始往右找直到找到比pivot大的值,等于也退出
l++;
}
while(arr[r] > pivot){//从右开始往左找直到找到比pivot小的值,等于也退出
r--;
}
if(l >= r){//需要手动退出,否则在接下来if中的r--或l++会导致后面递归时用到会出错
break;
}
//交换找到的值
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//当出现a[l] == a[r] == pivot 的情况时会导致上面while进入死循环,必须有个指针移动一位,
//所以交换过后,当其中一边为pivot时,另一边的指针移动(r--),不能l++原因:如果刚好交
//换前 a[l] 所指的位置正好是pivot所指位置l++会导致 while(arr[l] < pivot)一直后移。
if(arr[l] == pivot){
r--;
}
if(arr[r] == pivot){
l++;
}
}
if(r == l){
l++;
r--;
}
if(left < r){
quickSort(arr, left, r);
}
if(right > l){
quickSort(arr, l, right);
}
return arr;
}
//归并排序(分+合)
public static int[] mergeSort(int[] arr, int left, int right, int[] temp){
if(left < right){
int mid = (left + right) / 2;
//向左递归分解
mergeSort(arr, left, mid, temp);
//向右递归分解
mergeSort(arr, mid + 1, right, temp);
//合并
subMerge(arr, left, mid, right, temp);
}
return arr;
}
//归并之合
public static void subMerge(int[] arr, int left, int mid, int right, int[] temp){
int i = left;
int j = mid + 1;
int t = 0;
//将左右两边有序的数据填充到数组
while(i <= mid && j <= right){
if(arr[i] < arr[j]){
temp[t] = arr[i];
i++;
t++;
}else{
temp[t] = arr[j];
j++;
t++;
}
}
//将剩余的数据填充到数组
while(i <= mid){
temp[t] = arr[i];
t++;
i++;
}
while(j <= right){
temp[t] = arr[j];
t++;
j++;
}
//将temp数组copy到arr数组中
t = 0;
int templeft = left;
while(templeft <= right){
arr[templeft] = arr[t];
t++;
templeft++;
}
}
//显示数组
public static void show(int[] arr){
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}