java各种排序方法汇总

1. 冒泡排序

public class DemoArr1 {

	public static void main(String[] args) {
		int [] arr = {45,656,234,44,6};
		int temp;
		for(int i = 0; i < arr.length -1; i++) {//轮
			for(int j = 0; j < arr.length -1 - i ; j++) {//次
				if(arr[j] > arr[j+1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j+1] = temp;
				}
			}
		}	
		//循环遍历输出	
		for(int a:arr) {
			System.out.println(a);
		}
	}
}

补充二分查找

public class DemoArr11 {

	public static void main(String[] args) {
		int [] arr = {5,7,3,1,9};
		Scanner superman = new Scanner(System.in);
		//冒泡排序
		int temp;
		for(int i = 0; i < arr.length-1; i++) {
			for(int j = 0; j < arr.length-1-i; j++) {
				if(arr[j] > arr[j+1]) {
					temp = arr[j];
					arr[j] = arr[j +1];
					arr[j+1] = temp;
				}
			}
		}
		//二分查找
		System.out.println("--输入一个数字:");
		int num = superman.nextInt();
		int start = 0;
		int end = arr.length-1;
		int middle = (start + end)/2;
		while(arr[middle] != num) {
			if(num > arr[middle]) {
				start = middle + 1;
			}else if(num < arr[middle]) {
				end = middle -1;
			}
			if(start > end) {
				middle = -1;
				break;
			}
			middle = (start + end)/2;
		}
		System.out.println("位置:" + middle);
		if(middle == -1) {
			System.out.println("不存在");
		}else {
			System.out.println("存在");
		}				
	}
}

2. 选择排序

public class DemoArr2 {

	public static void main(String[] args) {
		int [] arr = {543,46,1,657,4};
		int temp;
		for(int i = 0; i < arr.length -1; i ++) {//位置
			for(int j = i + 1; j < arr.length; j++) {//后边元素
				if(arr[i] > arr[j]) {
					temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
		for(int a : arr) {
			System.out.println(a);
		}
	}
}

3.插入排序

public class DemoArr3 {

	public static void main(String[] args) {
		int [] arr = {23,90,9,25,16};
		int temp;
		for(int i = 1; i < arr.length; i++) {//位置
			for(int j = 0; j < i; j++) {//前边所有元素
				if(arr[i] < arr[j]) {
					//存起来
					temp = arr[i];
					//向后覆盖
					for(int k = i; k > j; k--) {
						arr[k] = arr[k-1];
					}
					//覆盖插入
					arr[j] = temp;
				}
			}
		}
		for(int a :arr) {
			System.out.println(a);
		}
	}
}

4.归并排序

public class MergeSort01 {
	public static void main(String[] args) {
		int[] arr1={1,2,4,5,7};
		int[] arr2={2,4,6,8,10,11};
		int[] mergeSort = mergeSort(arr1, arr2);
		System.out.println(Arrays.toString(mergeSort));
	}

	public static int[] mergeSort(int[] arr1,int[] arr2){
		//创建一个大数组   存放最终结果的
		int[] newarr=new int[arr1.length+arr2.length];
		//比较的过程
		int m=0;  //用于记录arr1的下标
		int n=0;  //用于记录arr2的下标
		int index=0; //用于记录newarr的下标
		//只要两个里面都有元素   一直重复比较
		while(m<=arr1.length-1 && n<=arr2.length-1){
			//arr1<arr2
			if(arr1[m]<arr2[n]){
				newarr[index++]=arr1[m++];
			}else{//arr1>=arr2
				newarr[index++]=arr2[n++];
			}
		}
		//说明有一个数组已经没有元素了
		//另外一个数组只需要全部过去
		while(m<=arr1.length-1){//arr1  还有元素
			newarr[index++]=arr1[m++];
		}
		while(n<=arr2.length-1){//arr2  还有元素
			newarr[index++]=arr2[n++];
		}
		
		return newarr;
	}
}

5.快速排序

public class QuickSort {
	public static void main(String[] args) {
		int[] arr1={34,56,78,90,12,32,1,23,45,36,36,56};
		System.out.println(Arrays.toString(arr1));
		quickSortLeft(arr1, 0, arr1.length-1);
		System.out.println(Arrays.toString(arr1));
	}
	/*
	 * 参数列表:
	 * int[] 数组  大数组
	 * int left 小集合的左侧边界
	 * int right  小集合的右侧边界
	 * 
	 */
	public static void quickSortLeft(int[] arr,int left,int right){
		//找出口
		if(left>=right){
			return;
		}else{
			//满足条件
			//找分界线的最终位置
			int index=getIndex(arr,left,right);
			//左侧开始递归
			quickSortLeft(arr, left, index-1);
			//右侧开始递归
			quickSortLeft(arr, index+1, right);
		}
	}

	//获取每一次的分界线的最终位置   仅考虑一个小集合
	public static int getIndex(int[] arr, int left, int right) {
		//初始化分界线  每一个小数据集的最左测的元素
		int key=arr[left];
		//循环遍历比较
		while(left<right){//外层循环一次  内层循环所有
			//先从右向左比较  从右向左获取每一个值   大于分界点   数组下标向前一位 right--
			while(arr[right]>=key && left<right){
				right--;
			}
			//出了循环  arr[right]<key  交换位置
			arr[left]=arr[right];
			//从左向右比较
			while(arr[left]<=key && left<right){
				left++;
			}
			//arr[left]》key
			arr[right]=arr[left];
		}
		//出了循环   最终的界限定了  left=right
		//给分界点  赋值
		arr[left]=key;			
		return left;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值