数组的冒泡和选择排序
数组在大部分的编程语言中都用的极其普遍和广泛,因为借助数组可以对数据进行各种处理
最常见的就是对数据进行排序,以下是两种简单的数组排序方法,选择排序,和冒泡排序
一:选择排序
选择排序就是选择数组的每一个项目都与其后面的每一个数组项目进行比较
假如是从小到大排序,选择排序第一轮就是拿第一个数组项目和后面的每一个比较,碰到比自己小的数字就互相交换
所以每一次都把小的数放在前面
public class Test6 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//选择排序 -> 每一轮选定一个元素 ,都它后面的每一个元素进行比较
//从小到大排序
int[] arr = {2, 59, 90, 30, 34};
//i表示每一轮选定的元素,倒数第一个就不用跟后面的元素比较了,所以i的下标最多到数组长度 - 2
// j表示其后的元素
for(int i = 0; i < arr.length - 1; i++){
//j是i后面每一个元素
for(int j = i + 1; j < arr.length; j++){
if(arr[i] > arr[j]){
//数组项目之间进行交换引入第三变量
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//for(int i : arr) 这种形式是增强for循环,冒号前面是数组的项目,冒号后面是要循环遍历的数组
for (int i : arr) {
System.out.println(i);
}
}
}
二:冒泡排序
冒泡排序:就是数组中的两两进行比较
第一轮:第一项和第二项比较,大的数在后面, 第二项和第三项进行比较,
第三项和第四项进行比较,第四项和第五项进行比较...以此类推 所以每一轮都把最大的元素找出来了
所以冒泡排序就比较n-1轮
int[] arr1 = {45, 89, 2, 45, 56};
//i是比较的轮数,已经定了,就是n-1轮
for(int i = 0; i < arr1.length - 1; i++){
//每一轮都把最大的元素找出来了,所以下一次比较就不用带着那个排好序的元素,第i轮
//i-1个元素已经排好序了
for(int j = 0; j < arr1.length - 1 - i; j++){
if(arr1[j] > arr1[j + 1]) {
int temp = arr1[j];
arr1[j] = arr1[j + 1];
arr1[j + 1] = temp;
flag = true;
}
}
}
for (int item : arr1) {
System.out.println(item);
}
但是这样写有一个问题,如果一个数组本来就是从小到大排好序的,就不需要交换了,所以可以引入一个标志flag代表这个数组是否是已经排好序的
int[] arr1 = {1, 2, 3, 4, 5};
boolean flag = false; //假定数组已经排好顺序的
for(int i = 0; i < arr1.length - 1; i++){
for(int j = 0; j < arr1.length - 1 - i; j++){
if(arr1[j] > arr1[j + 1]) {
int temp = arr1[j];
arr1[j] = arr1[j + 1];
arr1[j + 1] = temp;
flag = true;
}
}
if(flag == false) {
break;
} else {
flag = false;
}
}
for (int item : arr1) {
System.out.println(item);
}