冒泡排序
public static void sortCompare(){
int[] arr = {3,4,1,5,2};
/*
* 要遍历的次数
* 第一轮:43521比四次
* 第二轮:45321比三次
* 第三轮:45321比两次
* 第四轮:54321比一次
*/
for (int i = 0; i < arr.length-1; i++) {
//依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上
for (int j = 0; j < arr.length-1-i; j++) {
// 比较相邻的元素,如果前面的数小于后面的数,就交换
if(arr[j]<arr[j+1]) {
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
for(int count:arr) {
System.out.println(count);
}
}
选择排序
public static void select() {
int[] arr = {1,5,5,3,4,9};//待排序的数列
/*
*根据下标去找,每次找出最大或最小得一个
* 1,5,3,4,5,9
* 1,3,5,4,5,9
* 1,3,4,5,5,9
* ...
* 1,3,4,5,5,9
*/
//定义一个变量用于接受最小值的下标
int minIndex = 0;
for(int i = 0;i<arr.length;i++) {
minIndex=i;
for(int x = i+1;x<arr.length;x++) {
if(arr[minIndex]>arr[x]) {
minIndex = x;
}
}
//判断得到的最小值下表是不是它本身,是的话就不需要调换位置,否则
if(minIndex!=i) {
arr[minIndex]=arr[minIndex]+arr[i];
//8 3 5
arr[i]=arr[minIndex]-arr[i];
//arr[i]=8-5=3
arr[minIndex]=arr[minIndex]-arr[i];
//arr[minIndex]=5
}
}
for(int count: arr) {
System.out.println(count);
}
}
冒泡,选择排序的对比
冒泡排序 | 选择排序 |
---|---|
比较相邻位置的两个数 | 按顺序比较,找最大值或者最小值 |
每一轮比较后,位置不对都需要换位置 | 每一轮比较都只需要换一次位置 |
通过数去找位置 | 给定位置去找数 |
冒泡排序优缺点:优点:比较简单,空间复杂度较低,是稳定的;
缺点:时间复杂度太高,效率慢;
选择排序优缺点:优点:一轮比较只需要换一次位置;
缺点:效率慢,不稳定
不稳定性
算法的稳定性定义为,对于待排序列中相同项的原来次序不能被算法改变则称该算法稳定.
如当前的数组1,(5),【5】,3,4,9
当我们利用直接选择排序算法进行排序时候,(5)和后面的【5】调换,(5)就跑到了【5】的后面了,原来的次序改变了,这样就不稳定了.而冒泡排序就不会这样,(5)和后面的【5】比较时,就会进行下一步排序动作,两个的位置是不会改变的。