冒泡、选择、插入、希尔排序

冒泡、选择、插入、希尔排序

冒泡排序

//冒泡排序
public class BubbleSort{
	
	public static void main(String [] args){
		int[] arr = new int[]{8,4,2,1,23,344,12};
		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]){ //从小到大
				//if (arr [j] > arr [j+1]){ //从大到小
						int temp = arr[j];
						arr[j] = arr[j+1];
						arr[j+1] = temp;
					
				}
			}
		}
		for (int i=0; i<arr.length;i++){
		System.out.println(arr[i]);
		}
	}
}

选择排序

//选择排序 定义最后一位的坐标以及初始化默认第一位坐标为最大或最小
//比较次数不变 交换次数减少
public class SelectSort{

	public static void main(String [] args){
		int[] arr = new int[]{8,4,2,1,23,344,12};
		for (int i=0; i<arr.length-1; i++){
			int last = arr.length-1-i;//每轮的最后坐标
			int max = 0;//最大数的坐标 初始第一个数是最大的
			for (int j=1; j< arr.length-i; j++){//i=0时 j=1 代表第一个数跟第二个数对比
				if (arr [max] < arr [j]){//从小到大
				//if (arr [min] > arr [j]){	//从大到小
					max = j;//有数比max更大 将下标赋给max;
				}
			}
			//每轮结束 将max与last交换
			if (max != last){//等于时表示最后一位就是最大值 不需要交换
				int temp = arr[max];
				arr[max] = arr[last];
				arr[last] = temp;
			}
		}
	
		for (int i=0; i<arr.length;i++){
			System.out.println(arr[i]);
		}
	
	}
}

插入排序

//插入排序
//比较次数减少 交换次数减少

public class InsertSort{
	
	public static void main(String [] args){
		int[] arr = new int[]{8,4,2,1,23,344,12};
		for (int i=0; i<arr.length-1; i++){
			int curr = arr[i+1];//获取要判断的数字
			for(int j=i; j>=0; j--){
				//从小到大
				//if (curr < arr[j]){//curr:比较数 第一次循环的4 arr[j]:被比较数 第一次循环的8
				//从大到小
				if (curr > arr[j]){ 
					arr[j+1] = arr[j]; //需要换座位时 把被比较数向后一位	
				} else {
					break;//如果前面小 直接退出当层循环
				}
			arr[j] = curr;//将比较数插入新座位
			}
			
		}
	
		for (int i=0; i<arr.length;i++){
			System.out.println(arr[i]);
		}
	
	}
}

希尔排序

//希尔排序


public class ShellSort{
	public static void main(String [] args){
		int[] arr = new int[]{8,4,2,1,23,344,12};
		//分组插入
		//计算步长 arr.length / 2 ==> 3; [8,1,12] [4,23] [2,344]
		//小组排序 [1,8,12] [4,23] [2,344] ==> [1,4,2,8,23,344,12]
		//重新计算步长 原步长/2 ==> 1;
for (int jump = arr.length/2;jump>0;jump/=2) {
	for (int i=jump;i<arr.length;i++){//用每组第二个数的下标记录这一组
		int value = arr[i];//获取要判断的数字
		int j;//因为作用域 所以需要外部定义
//跟插入排序同理   j>=0:结束条件   value>arr[j]:比较数与被比较数比较条件
		for (j=i-jump; j>=0 && value<arr[j]; j-=jump){//value:比较数 arr[j]:被比较数
			arr[j+jump] = arr[j];//此时j要减步长 找到同组的数比较    
				}
		arr[j+jump] = value;
			}	
		}
	
	for (int i=0; i<arr.length;i++){
			System.out.println(arr[i]);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值