排序是最基本的算法,理解各類排序的原理,效率,複雜度有助於開拓思維,對算法有一個簡單的入門!
按平均複雜度來講,冒泡,選擇,插入的複雜度相同(On^2),也是最好理解最簡單的排序方法,在生活中的應用也比較多。
選擇排序是最直觀,最簡單的排序方法,一句話來概括:n個數裏,找最小(大)的換到最前面,對n-1,n-2...2,1(除確認是最小(大)的以外的)依次找最小的交換。
public static void select_sort(int array[],int lenth){
for(int i=0;i<lenth-1;i++){
int minIndex = i;
for(int j=i+1;j<lenth;j++){
if(array[j]<array[minIndex]){
minIndex = j;
}
}
if(minIndex != i){
int temp = array[i];
array[i] = array[minIndex];
array[minIndex] = temp;
}
}
}
冒泡排序是改良版的選擇排序,將選擇排序找最小(大)交換到首位,改良成相鄰的兩個值比較然後將較大的交換到後面。如果序列基本有序 排序速度會大大優於選擇排序,但如果是倒敘的話。。和選擇排序效率一樣(最常用,簡單的)。
如果序列排好了 冒泡排序會繼續下去,爲了節省時間可以加狀態碼標識,如果沒有發生交換就跳出(依然會多遍歷一次)
public static void BubbleSort(int [] arr){
int temp;//臨時變量
for(int i=0; i<arr.length-1; i++){ //表示趟數,一共arr.length-1次。
for(int j=arr.length-1; j>i; j--){
if(arr[j] < arr[j-1]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
}
插入排序 將值放到已有序數列的合適位置(一個數也可以看做有序),插入方法(將前一個有序數列長度增加,然後遍歷交換),感覺本質是一樣的。
public static void insert_sort(int array[],int lenth){
int temp;
for(int i=0;i<lenth-1;i++){
for(int j=i+1;j>0;j--){
if(array[j] < array[j-1]){
temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
}else{ //不需要交換
break;
}
}
}
}
採用分治的思想進行排序
快速排序 快速排序效率優於上面三種,程序的執行效率很重要!!! 基本思想是:以第一個值爲標識 比它小的放在它左側,大的放右側 再分別對兩側的執行相同步驟 直到標識兩側只有一個值。
public static void quickSort(int a[],int l,int r){
if(l>=r)
return;
int i = l; int j = r; int key = a[l];//選擇第一個數爲key
while(i<j){
while(i<j && a[j]>=key)//從右向左找第一個小於key的值
j--;
if(i<j){
a[i] = a[j];
i++;
}
while(i<j && a[i]<key)//從左向右找第一個大於key的值
i++;
if(i<j){
a[j] = a[i];
j--;
}
}
//i == j
a[i] = key;
quickSort(a, l, i-1);//遞歸調用
quickSort(a, i+1, r);//遞歸調用
}