冒泡排序(稳定)
稳定性:指排序序列中相同数据在排序后顺序是否改变,不改变为稳定,改变为不稳定
排序规则
相邻元素两两比较,大的往后排,直到一轮比较结束,最大值出现在下标最大处(升序);往复执行排序完成为止;共循环(arr.length-1)次。
基本类型比较 :
public class test{
public static void main(){
int [] arr = {23,12,4,25,9,2,45};
//i表示比较的轮数
for(int i = 0;i <arr.length-1;i++){
//j表示数组元素下标
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;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
引用类型比较:引用类型通过比较器进行比较 arr[j].compareTo(arr[j+1])
选择排序(不稳定)
排序规则
第一次从待排序部分选择出最小值/最大值,放置在序列起始位置,再从未排序部分选择出最小值/最大值,放到已排序序列的末尾位置,直到排序完成。
//选择排序(升序)
int [] a = {2,6,1,45,8,34,45,8,9};
//最小值对应下表
int min;
//对下标为i位置求最小值
for(int i = 0;i <a.length-1;i++){
min = i;
//将后续元素值均与min位置的值进行比较
for(int j = i+1;j <a.length;j++){
if(a[min] > a[j]){
min = j;
}
}
//将min位置的值与i位置的值交换
if(min != i){
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
System.out.println(Arrays.toString(a));
插入排序(稳定)
排序规则
将序列分为已排序部分和未排序部分,遍历未排序部分,将遍历到的元素插入已排序部分正确的位置。(排序开始之前,第一个元素即为已排序部分)
int [] a = {7,4,2,9,1,7,9};
//对未排序部分进行遍历
for(int i = 1;i < a.length;i++){
//j表示被比较交换的元素实时下标
for(int j = i;j > 0;j--){
//从已排序序列最后一个元素开始往前比较
if(a[j] < a[j-1]){
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
System.out.println(Arrays.toString(a));