1 冒泡排序
顾名思义:小的数一点一点向前冒,最终有序
时间复杂度:O(n^2)
public static void bubbleSort(int[] arr){
if(arr == null || arr.length <2){
return;
}
for(int i=arr.length-1; i>0; i--){
for(int j=0; j<i; j++){
if(arr[j] > arr[j+1]){
swap(arr,j,j+1);
}
}
}
}
public static void swap(int[] arr,int i,int j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
2 插入排序
基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。
时间复杂度:O(n^2)
public static void insertSort(int[] arr){
if(arr == null || arr.length < 2){
return;
}
for(int i=1; i<arr.length; i++){//默认第一位已排好序
for(int j=i-1;j>=0; j--){
if(arr[j] > arr[j+1]){
swap(arr,j,j+1);
}
}
}
}
public static void swap(int[] arr,int i,int j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
3 选择排序
基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
时间复杂度:O(n^2)
public static void selectSort(int[] arr){
int size = arr.length;
for(int i=0;i<size-1;i++){
int minIndex = i;//最小元素的位置
for(int j=i+1; j<size; j++){
if(arr[j]<arr[minIndex])
minIndex = j;
}
//交换两个数
swap(arr,i,minIndex);//注意此题i和minIndex存在相等的情况,此时若用异或来交换两个数会出错
}
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}