java中的六种排序:冒泡,选择,插入,希尔,快速,归并

冒泡,选择,插入,希尔,快速,归并

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();
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值