面試前的準備(java專業 ~學習演算法排序以及查詢)
阿新 • • 發佈:2018-12-01
java專業的馬上大三,東西學的差不多,但是資料結構這塊特別薄弱,所以面試前對自己資料結構進行鞏固複習(PS:其實是預習啦~)
針對自己薄弱的幾塊進行記錄:(排序和查詢)
每天都在叫囂自己會什麼技術,什麼框架,可否意識到你每天都在被這些新名詞、新技術所迷惑,.NET、XML等等技術固然誘人,可是如果自己的基礎不紮實,就像是在雲裡霧裡行走一樣,只能看到眼前,不能看到更遠的地方。這些新鮮的技術掩蓋了許多底層的原理,要想真正的學習技術還是走下雲端,紮紮實實的把基礎知識學好,有了這些基礎,要掌握那些新技術也就很容易了。
要編寫出優秀的程式碼同樣要紮實的基礎,如果排序和查詢演算法學的不好,怎麼對程式的效能進行優化?廢話不多說,本文要介紹的這些排序演算法就是基礎中的基礎,程式設計師必知!(引自:http://www.cr173.com/html/15301_1.html)
1、排序
1.插入排序—直接插入排序(Straight Insertion Sort)
2. 插入排序—希爾排序(Shell`s Sort)
3. 選擇排序—簡單選擇排序(Simple Selection Sort)
4. 選擇排序—堆排序(Heap Sort)
5. 交換排序—氣泡排序(Bubble Sort)
6. 交換排序—快速排序(Quick Sort)
7. 歸併排序(Merge Sort)
8. 桶排序/基數排序(Radix Sort)
對於上面的幾種排序,面試的時候最容易問的就是快速排序和氣泡排序,所以就對這兩種排序重點說明!快速排序的示例:
(a)一趟排序的過程:
(b)排序的全過程java程式碼實現快速排序: (自己的敘述...)1.首先定義一個數組,陣列的第一個數值為Key
/**
* description : 快速排序
* @autor kwzhang
* modify :2012-6-20
*
* @param pData
* @param left
* @param right
* @return
*/
static
void
quicksort(
int
n[],
int
left,
int
right) {
int
dp;
if
(left < right) {
dp = partition(n, left, right);
quicksort(n, left, dp -
1
);
quicksort(n, dp +
1
, right);
}
}
static
int
partition(
int
n[],
int
left,
int
right) {
int
pivot = n[left];
while
(left < right) {
while
(left < right && n[right] >= pivot)
right--;
if
(left < right)
n[left++] = n[right];
while
(left < right && n[left] <= pivot)
left++;
if
(left < right)
n[right--] = n[left];
}
n[left] = pivot;
return
left;
}
氣泡排序(Bubble Sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
氣泡排序演算法的運作如下:
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
- 針對所有的元素重複以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
氣泡排序的過程圖:
程式碼:
1 public class BubbleSort{
2 public static void main(String[] args){
3 int score[] = {67, 69, 75, 87, 89, 90, 99, 100};
4 for (int i = 0; i < score.length -1; i++){ //最多做n-1趟排序
5 for(int j = 0 ;j < score.length - i - 1; j++){ //對當前無序區間score[0......length-i-1]進行排序(j的範圍很關鍵,這個範圍是在逐步縮小的)
6 if(score[j] < score[j + 1]){ //把小的值交換到後面
7 int temp = score[j];
8 score[j] = score[j + 1];
9 score[j + 1] = temp;
10 }
11 }
12 System.out.print("第" + (i + 1) + "次排序結果:");
13 for(int a = 0; a < score.length; a++){
14 System.out.print(score[a] + "\t");
15 }
16 System.out.println("");
17 }
18 System.out.print("最終排序結果:");
19 for(int a = 0; a < score.length; a++){
20 System.out.print(score[a] + "\t");
21 }
22 }
23 }
快速排序適用於陣列的數值較大,以及初始化記錄無序的情況! 各種排序時間複雜度和空間複雜度總結: