今天覆習到陣列部分,發現陣列部分中比較重要的可能就是排序這個問題了。其他像遍歷、填充替換陣列元素、複製陣列、查詢陣列等都相對簡單,就把排序部分稍作整理。沒什麼高深知識,隨便看看就好。
首先貼出氣泡排序和直接選擇排序的**,兩者相近且比較簡單,本來打算分著寫更明顯,不過看著實在太短了,就在乙個類中寫出了,類名也沒改,大家將就看吧=。=
public
class bubblesort ;
bubble(a);
select(a);
}public
static
void
bubble(int arr)}}
for(int x:arr)
system.out.println();
}public
static
void
select(int arr)
}int temp;
temp=arr[arr.length-1-i];
arr[arr.length-1-i]=arr[index];
arr[index]=temp;
}for(int x:arr)
}}
在我看來,氣泡排序和直接選擇排序相近。兩者的比較次數相同,交換次數:氣泡排序》直接選擇排序,**有一定的相似性。
兩者**都是有巢狀的兩層for迴圈作為主體,氣泡排序是相鄰兩數比較,若前者大於後者,則交換位置,直接選擇排序則是一輪迴圈下來用乙個index標記此輪迴圈的最大值,然後在內層for迴圈結束後進行本輪最後乙個位置和最大值的交換。
而快速排序和他們則有所區別。
public
class quicksort ;
quicksort(arr, 0, arr.length - 1);
//quick(arr,0,arr.length-1);
for (int x : arr)
}public
static
void
quicksort(int arr, int top, int end)
}public
static
intpartition(int arr, int top, int end)
arr[top] = arr[j];
arr[j] = x;
return j;
}public
static
void
quick(int a, int left, int right)
}a[j + 1] = ai;//到此會發現i+1位之前都是從小到大排序,即每完成一輪迴圈,陣列前面的數就多乙個有序的。}}
}
快速排序則和他們完全不同。快速排序用到了分治思想,用遞迴演算法達到將陣列分割,簡化排序過程。
每一次呼叫quicksort()方法都會將當前陣列分成三部分:首項、>首項、《首項。
分別在後兩個陣列中再呼叫quicksort()方法,分割的下標則是由partition()方法決定的partition為「劃分」意,在這裡用來找到首項應該在的下標位置。
上述**中還出現了乙個方法quick(),這個方法是從arrays.sort()方法的原始碼中找到的,一開始我認為是快速排序的乙個非遞迴化變形,後來發現似乎不是如此,這個方法是從第乙個數開始,不斷的往後擴充套件,沒新增乙個數就找到這個數應當在的前面的位置,感覺類似直接選擇排序的倒敘版,但是他每一次又不會遍歷整個陣列,所以說我也拿不準究竟如何形容他,不過他玲瓏的**段還是驚豔到我了,果然程式設計是一門藝術活,總有一些神奇的**片有著匪夷所思的用處。
如有不妥,敬請交流指教。
常用基礎陣列排序演算法
解題思路 1 1 n個數字,自己 與 下一位 比較,選中最大的放在 下一位 再以 下一位 為 自己 與 下一位 比較,直到選出最大的數字放在最後 2 1 n 1 個數字,重複第一步驟操作 n 直到剩下最後乙個數字 思路 解題思路 1 從1 n 個數字中選擇最小的數字放在 第乙個 2 從2 n 個 重...
陣列的常用排序演算法 二
這是乙個陣列的常用方法的引用,比如 陣列的冒泡查詢,選擇排序,二分法查詢 author along version 1.0 public class arraytool param int 求陣列的最大值 return int 返回乙個整型的最大值 public static int getmax ...
Java陣列常用排序演算法實現複習
冒泡演算法由雙層迴圈實現,其中外層迴圈用於控制排序輪數,一般是要排序的陣列長度減1次,因為最後一次迴圈只剩下乙個陣列元素,不需要對比,同時陣列已經完成排序了。而內層迴圈主要用於對比陣列中每個相鄰元素的大小,以確定是否交換位置,對比和交換次數以排序輪數而減少。演算法實現 package captain...