第九章、排序
1、排序:是使得乙個序列成為按關鍵字有序的序列的操作。排序穩定性:排序過程中排序前順序和排序中不變是穩定排序。內排序和外排序:指待排序所有記錄是否在記憶體中操作。外排序是排序記錄態度要在內外存之間多次交換。(內排序:插入、交換、選擇和歸併)
2、氣泡排序:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。 然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到乙個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。
public class bubblesort
}} }
}
3、簡單選擇排序:選擇排序基本思路:把第乙個元素依次和後面的所有元素進行比較。第一次結束後,就會有最小值出現在最前面。依次類推。
public class selectionsort
}} }
}
4、插入排序:
插入排序基本思想,將n個元素的數列分為已有序和無序兩個部分,如插入排序過程示例下所示: ,} 。,} 。,} 每次處理就是將無序數列的第乙個元素與有序數列的元素從後往前逐個進行比較,找出插入位置,將該元素插入到有序數列的合適位置中。
public class insertsort
} }}
5、希爾排序:先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成(n除以d1)個組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序;然後,取第二個增量d2
public class shellsort
} insertsort(data, 0, 1);
} private static void insertsort(int data, int start, int inc)
} }}
6、歸併排序: 歸併操作(merge),也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。
如設有數列
初始狀態:[6] [202] [100] [301] [38] [8] [1]比較次數
i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ]3
i=2 [ 6 100 202 301 ] [ 1 8 38 ]4
i=3 [ 1 6 8 38 100 202 301 ]4
public class mergesort
private static void mergesort(int data, int temp, int l, int r)
int i1 = l;
int i2 = mid + 1;
for (int cur = l; cur <= r; cur++)
}}
7、堆排序:堆排序利用了大根堆(或小根堆)堆頂記錄的關鍵字最大(或最小)這一特徵,使得在當前無序區中選取最大(或最小)關鍵字的記錄變得簡單。(1)用大根堆排序的基本思想①先將初始檔案r[1..n]建成乙個大根堆,此堆為初始的無序區②再將關鍵字最大的記錄r[1](即堆頂)和無序區的最後乙個 記錄r[n]交換,由此得到新的無序區r[1..n-1]和有序區r[n],且滿足r[1..n-1].keys≤r[n].key。③由於交換後新的根r[1]可能違反堆性質,故應將當前無序區r[1..n-1]調整為堆。然後再次將r[1..n-1]中關鍵字最大的記錄r[1]和該區間的最後乙個記錄r[n-1]交換,由此得到新的無序區r[1..n-2]和有序區r[n-1..n],且仍滿足關係r[1..n-2].keys≤r[n-1..n].keys,同樣要將r[1..n-2]調整為堆。直到無序區只有乙個元素為止。(2)大根堆排序演算法的基本操作:① 初始化操作:將r[1..n]構造為初始堆。②每一趟排序的基本操作:將當前無序區的堆頂記錄r[1]和該區間的最後乙個記錄交換,然後將新的無序區調整為堆(亦稱重建堆)。
public class heapsort
private static class maxheap
} private int size = 0;
private int queue;
public int get()
public void remove()
// fixdown
private void fixdown(int k)
} private void fixup(int k)
} }}
8、快速排序:一趟快速排序的演算法是
1)設定兩個變數i、j,排序開始的時候:i=0,j=n-1
2)以第乙個陣列元素作為關鍵資料,賦值給key,即 key=a[0]、 3)從j開始向前搜尋,即由後開始向前搜尋(j=j-1即j--),找到第乙個小於key的值a[j],a[i]與a[j]交換
4)從i開始向後搜尋,即由前開始向後搜尋(i=i+1即i++),找到第乙個大於key的a[i],a[i]與a[j]交換;
5)重複第3、4、5步,直到 i=j,(3,4步是在程式中沒找到時候j=j-1,i=i+1,直至找到為止。找到並交換的時候i, j指標位置不變。另外當i=j這過程一定正好是i+或j-完成的最後令迴圈結束。
public class quicksort
private static void quicksort(int data, int i, int j)
private static int partition(int data, int l, int r, int pivot) while (l < r);
sorttest.swap(data, l, r);
return l;
}}
各排序演算法的效能對比
大話資料結構讀書筆記
第一章 資料結構的定義 資料就夠是相互直接存在一種或多種特定關係的資料元素的集合 邏輯結構 集合結構 線性結構 樹形結構 圖形結構 第二章 演算法 1 演算法的特性 輸入 輸出 有窮性 確定性和可行性 2 演算法事假複雜度定義 在進行演算法分析時,語句總的次數t n 第三章1 線性表 定義 零個或多...
大話資料結構 讀書筆記
是相互之間存在一種或多種特定關係的資料元素的集合。說白了就是資料的集合 但是集合裡面的資料之間存在特地的關係 這翻譯得好像沒說一樣 是指資料元素之間的相互關係 指資料的邏輯結構在計算機儲存形式 鏈式儲存結構 是把資料元素存放在任意的儲存單元 這組儲存單元可以是連續的 也可以是不連續的 資料型別指的是...
讀書筆記 大話資料結構 1
對於電腦科學,資料結構的重要性不言而喻。它對於乙個程式設計師的功力的提高起著關鍵的作用。勿在浮沙築高台,想要成為一名合格的hacker。基礎理論決定乙個程式設計師思維的深度。介於此,決定認真學習資料結構,找到比較基礎易懂的大話資料結構來開始我的學習之旅。資料結構 相互之間存在一種或多種特定關係的資料...