1. 程式人生 > >面試前的準備(java專業 ~學習演算法排序以及查詢)

面試前的準備(java專業 ~學習演算法排序以及查詢)

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
2.在這個陣列前後各設定一個i和j做標記 3.從 前往後遍歷然後讓他們與第一個數值key進行比較,當數值小於key的時候與key交換位置,一直遍歷到最後一個,j--, 然後如果找到有比key小的數字,i++, 迴圈遍歷直到i=j! 程式碼: /**      * 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.  比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2.  對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3.  針對所有的元素重複以上的步驟,除了最後一個。
  4.  持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

氣泡排序的過程圖:

Bubble Sorte Animation

程式碼:

複製程式碼
 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 }


快速排序適用於陣列的數值較大,以及初始化記錄無序的情況! 各種排序時間複雜度和空間複雜度總結: