快速上手冒号排序

快速上手冒号排序
原理:
1,如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。
2,比较两个相邻的元素,将大的值向右移动
3,依次比较第一遍就将最大的值遍历在最后

从最简单开始,首先我们创建一个数组,该数组有5位数字:

int[] arrays= {1,9,6,5,8};
//第一次遍历
int temp;

//第一位和第二位比
if (arrays[0] > arrays[1]) {
    //交换
    temp = arrays[0];
    arrays[0] = arrays[1];
    arrays[1] = temp;
}

//第二位和第三位比
if (arrays[1] > arrays[2]) {
    temp = arrays[1];
    arrays[1] = arrays[2];
    arrays[2] = temp;
}

//第三位和第四位比
if (arrays[2] > arrays[3]) {
    temp = arrays[2];
    arrays[2] = arrays[3];
    arrays[3] = temp;
}

//第四位和第五位比
if (arrays[3] > arrays[4]) {
    temp = arrays[3];
    arrays[3] = arrays[4];
    arrays[4] = temp;
}

经过我们第一组排序遍历,已经可以看出最大的值排序到最后

在这里插入图片描述

第二组遍历,跟第一组遍历一样,第二组也是两个相邻的元素进行比较,把大的元素向右边移动,第二组元素也把倒数第二大的排序出来了

//第一位和第二位比
if (arrays[0] > arrays[1]) {
    //交换
    temp = arrays[0];
    arrays[0] = arrays[1];
    arrays[1] = temp;
}

//第二位和第三位比
if (arrays[1] > arrays[2]) {
    temp = arrays[1];
    arrays[1] = arrays[2];
    arrays[2] = temp;
}

//第三位和第四位比
if (arrays[2] > arrays[3]) {
    temp = arrays[2];
    arrays[2] = arrays[3];
    arrays[3] = temp;
}

在这里插入图片描述
这里我的造数不够乱,比较了两次就把数据排好序了
规律:

  1. 可以看出第一次排序比较了四次,就把最大值排序在最后了

  2. 第二次排序比较了三次,由于第一次已经把最大值排序好了在最后,不用在进行比较

  3. 我们这里有五个数组,由此可以看出规律

  4. 第三次排序比较两次

  5. 第四次排序比较一次

由此可以得出结论,我们有五个数比较了四次,每次比较都减少了一次,由于每次排序已经把最大的值往后移,总共要进行N-1趟比较,每趟的排序次数为(N-i)次比较

    因此我们可以把代码简写成这样
	int[] array= {1,9,6,5,8};
	//比较趟数
	for (int i = 0; i < array.length-1; i++) {
		//相邻的两个元素比较,大的往右边移
		for (int j = 0; j < array.length-1-i; j++) {
			if(array[j]>array[j+1]) {
				int temp=array[j];
				array[j]=array[j+1];
				array[j+1]=temp;
			}
		}
	}

代码优化,这里我们可以设置一个变量看看是否进行位置替换,没有进行位置替换就说明已经排序好了,不用继续遍历比较

	int change;
	int[] array= {1,9,6,5,8};
	//比较趟数
	for (int i = 0; i < array.length-1; i++) {
		change=0;//记录是否发生了置换, 0 表示没有发生置换、 1 表示发生了置换
		//相邻的两个元素比较,大的往右边移
		for (int j = 0; j < array.length-1-i; j++) {
			if(array[j]>array[j+1]) {
				int temp=array[j];
				array[j]=array[j+1];
				array[j+1]=temp;
				//到达这里说明进行位置替换
				change=1;
			}
		}
		if(change==0) {
			break;
		}
	}

如果文章有错的地方欢迎指正,大家互相交流

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值