排序稳定性的含义:
如果排序算法能够保留数组中重复元素的的相对位置则可以被称为是稳定的,比如我们要根据两个键对数据进行排序,按照第一个主要键排好序之后,再对第二个键排序,这个时候排序算法的稳定性就非常重要
常见的稳定的排序有冒泡排序 插入排序 归并排序
不稳定的排序有选择排序 希尔排序 快速排序 三向快速排序 和堆排序
冒泡排序
冒泡排序每次都是比较相邻的两个元素,若这两个相邻的元素相等则不会交换位置,所以冒泡跑排序是稳定的,内层循环结束就把最大的元素放到后面了,外层循环i控制每次冒泡都是从第一个元素开始,里层循环结束的条件是a.length-i,因为走了i+1趟之后后面i+1和元素就有序了,所以不用再对后面的元素比较,减少了比较次数
public class Bubble {
public static void bubble(int a[]){
for(int i=0;i<a.length;i++){
for(int j=1;j<a.length-i;j++){
if(a[j]<a[j-1]){
int temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
}
测试用例:3241
打印每趟之后的结果,发现后面一趟是重复的,所以继续优化,减少趟数
public class Bubble2 {
public static void bubble(int a[]){
for(int i=0;i<a.length;i++){
boolean sorted=true;
for(int j=1;j<a.length-i;j++){
if(a[j]<a[j-1]){
int temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
sorted=false;
}
}
if(sorted){
break;
}
Bubble.printarray(a);
System.out.println();
}
}
选择排序
选择排序就是首先选择数组中最小的元素和第一个元素交换,再次从剩下的元素中找到最小的元素和第二个元素交换,选择排序不会维持相等元素的相对位置,比如数组是 3, 4, 3,1,,第一趟3和1交换,则破坏了原来3和3的顺序所以是不稳定的
public static void selection(int []a){
for(int i=0;i<a.length;i++){
int min=i;
for(int j=i+1;j<a.length;j++){
if(a[j]<a[min]){
min=j;
}
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
//Bubble.printarray(a);
//System.out.println();
}
}