一、冒泡排序
①通过比较数组中相邻的两个元素的大小,如果前一个数比后一个数大,我们就让它们交换(交换是通过再一次引入一个新的变量实现的)
②每一大轮结束时,都会产生一个最大的或者是最小的数(比如第一大轮就是拿数组的第一个数进行循环操作)
③下一大轮可以少一次排序
下面是代码的实现
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]) {
//这种判断是从小到大排的方式,改变条件就能变成从大到小排列
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
优化部分:当一个数组在没有执行完循环之前就已经排好序了,那么为了使时间更加优化,可以采用下面的方法
for (int i = 0; i < arr.length - 1; i++) {
boolean isFlag = false;
//新增一个boolean型的变量,当不需要排序时,直接跳出内层循环
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
isFlag = true;
}
if (isFlag == false){
break;
}
}
}
二、选择排序
①首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
②再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
③重复第二步,直到所有元素均排序完毕。
下面是代码的实现
for (int i = 0; i < arr.length - 1; i++) {
//外层循环依旧是循环的轮数
int min = i;
for (int j = i + i; j < arr.length; j++) {
//让i与其他的剩下的所有数进行比较
if (arr[j] < arr[min]) {
min = j;
}
}
//如果每次比较出现了新的最小的数,就交换元素
if (min != i) {
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
三、插入排序
①将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
②从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
for (int i = 1;i < arr.length;i++){
// 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
int temp = arr[i];
// 记录要插入的数据,temp只是一个临时变量用来储存数的
int j = i;
// 从已经排序的序列最右边的开始比较,找到比其小的数
while (j>0 && temp < arr[j-1]){
arr[j] = arr[j-1];
j--;
}
// 存在比其小的数,插入
if (i!=j){
arr[j] = temp;
}
}
for (int k = 0;k < arr.length;k++){
System.out.print(arr[k]+"
");
}
最后
以上就是阔达故事最近收集整理的关于三大排序的总结的全部内容,更多相关三大排序内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复