需求:对数组中数字进行排序
选择排序:
思想:从头开始,最小值和第一个交换,次小值和第二个交换。。。。。
private static void SelectionSort(int[] arr) {
for(int i=0;i<arr.length;i++){
int min=i;
for(int j=i+1;j<arr.length;j++){
if(arr[j]<arr[min]){
min=j;
}
}
int tmp = arr[min];
arr[min] =arr[i];
arr[i]=tmp;
}
}
最好情况=最差情况=O(n^2)
插入排序:
思想:假定前面i个已经排好序,从i+1开始依次向前比较,插入到合适位置
private static void InsertionSort(int[] arr) {
for(int i=1;i<arr.length;i++){
int key = arr[i];
int n=i;
while(n>0&&key<arr[n-1]){
arr[n] = arr[n-1];
n--;
}
arr[n]=key;
}
}
最好情况:顺序排列 O(n)
最坏情况:逆序排列O(n^2)
平均情况:O(n^2)
冒泡排序:
思想:相邻比较交换,一趟完成最大的上浮
private static void BubbleSort(int[] arr) {
for(int i=0;i<arr.length-1;i++){
boolean flag = true;//如果不设标识,复杂度都为O(n^2)
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
int tmp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
flag = false;
}
}
if(flag){
return;
}
}
}
最好情况:O(n)因为设置了标识,所以仅进行一次数量为n的比较
最坏情况:O(n^2)
平均情况:O(n^2)