比较排序
1.冒泡排序
- 算法思想:每次循环将最大/最小的元素顶到最前端,两层for循环
- 平均时间复杂度:O(n²)
- 最好时间复杂度:O(n)
- 空间复杂度:O(1),仅需常数个辅助空间
- 稳定性:稳定
代码:
public static void main(String[] args) {
int[] arr={15,1,6,12,3,7,9,2};
bubbleSort(arr);
printArr(arr);
}
private static void bubbleSort(int[] arr) {
for (int i=0;i<arr.length;i++){
for (int j = arr.length-1; j >i ; j--) {
if(arr[j]<arr[j-1]){
swap(arr,j,j-1);
}
}
}
}
private static void swap(int[] arr,int i, int i1) {
int temp;
temp=arr[i];
arr[i]=arr[i1];
arr[i1]=temp;
}
public static void printArr(int[] arr){
StringBuilder sb=new StringBuilder("[ ");
for (int i = 0; i <arr.length ; i++) {
sb.append(arr[i]+" ");
}
sb.append("]");
System.out.println(sb.toString());
}
2.选择排序
- 算法思想:每次从待排序数组中选择一个最小的排在前卫
- 平均时间复杂度:O(n²)
- 最好时间复杂度:O(n)
- 空间复杂度:O(1),仅需常数个辅助空间
- 稳定性:不稳定
代码:
public static void main(String[] args) {
int[] arr={15,1,6,12,3,7,9,2};
selectSort(arr);
printArr(arr);
}
private static void selectSort(int[] arr) {
for (int i = 0; i <arr.length-1 ; i++) {
int min=i;
for (int j = i+1; j < arr.length; j++) {
if(arr[j]<arr[min]){
min=j;
}
}
if(min!=i){
swap(arr,i,min);
}
}
}
private static void swap(int[] arr,int i, int i1) {
int temp;
temp=arr[i];
arr[i]=arr[i1];
arr[i1]=temp;
}
public static void printArr(int[] arr){
StringBuilder sb=new StringBuilder("[ ");
for (int i = 0; i <arr.length ; i++) {
sb.append(arr[i]+" ");
}
sb.append("]");
System.out.println(sb.toString());
}
3.插入排序
- 算法思想:每次从待排序数组中选择一个最小的排在前卫
- 平均时间复杂度:O(n²)
- 最好时间复杂度:O(n)
- 空间复杂度:O(1),仅需常数个辅助空间
- 稳定性:稳定
public static void insertSort(int[] arr) {
for (int i =0; i < arr.length; i++) {
int lastIndex = i-1;
int v=arr[i];
while(lastIndex > -1 && v < arr[lastIndex]){
arr[lastIndex + 1] = arr[lastIndex];
lastIndex--;
}
arr[lastIndex + 1] = v;
}
}