程序语言:Java
定义交换函数:
public void swap(int[] arr, int i, int j){
if(i == j) return;
arr[i] = arr[i]^arr[j];
arr[j] = arr[i]^arr[j];
arr[i] = arr[i]^arr[j];
}
选择排序
分析:每次从未排好序部分遍历一遍保留最小值的脚标,与第一个交换。
最好时间复杂度:遍历 O(n^2)
最坏时间复杂度:遍历 O(n^2)
空间复杂度:需要额外空间保留脚标。
代码:
public void selectionSort(int[] arr){
int index;
for(int i = 0; i < arr.length; i++){
index = i;
for(int j = i+1; j < arr.length; j++)
if(arr[index] > arr[j]) index = j;
if(index != i) swap(arr, index, i);
}
}
插入排序
分析:每次假设前面已经排好的序列,将下一个值插入到该序列中去。
最好时间复杂度:遍历 O(n)
最坏时间复杂度:交换 O(n^2)
空间复杂度:不需要额外空间
代码:
public void insertionSort(int[] arr){
for(int i = 1; i < arr.length; i++)
for(int j = i; j > 0; j--){
if(arr[j-1] > arr[j]) swap(arr, j ,j-1);
else break;
}
}
冒泡排序
分析:每次遍历一遍都将最大的冒到后面去。
最好时间复杂度—-取决于是否有flag标记:若没有 O(n^2),若有O(n)
最坏时间复杂度:遍历 O(n^2)
空间复杂度:不需要额外空间
代码:
无flag版
public void bubbleSort(int[] arr){
for(int i = 0; i < arr.length-1; i++)
for(int j = 0; j < arr.length-i-1; j++)
if(arr[j] > arr[j+1]) swap(arr, j, j+1);
}
有flag版
public void bubbleSort(int[] arr){
boolean flag;
for(int i = 0; i < arr.length-1; i++){
flag = true;
for(int j = 0; j < arr.length-i-1; j++){
if(arr[j] > arr[j+1]) {
swap(arr, j, j+1);
flag = false;
}
}
if(flag) break;
}
}