1>排序是把乙個記錄(在排序中把資料元素稱為記錄)集合或序列重新排列成按記錄的某個資料項值遞增或者遞減的序列。
2>在為排序依據的資料項稱為「排序項」,也成為排序的關鍵碼,關鍵碼分為主關鍵碼和次關鍵碼。
3>排序分為內部排序和外部排序。內部排序指的是在排序的整個過程中,記錄全部存放在計算機的記憶體中,並且在記憶體中調整記錄之間的相對位置,在此期間沒有進行內、外存的資料交換。 外部排序指的是在排序過程中,記錄的主要部分存放在外存中,借助於記憶體逐步調整記錄之間的相對位置。在這個過程中,需要不斷地在內、外存之間交換資料。
4>排序問題的記錄採用線性結構。順序表具有隨機訪問的特性,訪問任意乙個資料元素的時間複雜度為o(1),而鍊錶不具有隨機訪問的特性,訪問任意乙個資料元素的時間複雜度為o(n),所以排序演算法是基於順序表設計的。
直接插入排序
直接插入排序(direct insert sort)的基本思想是:順序地將待排序的記錄按其關鍵碼的大小插入到已排序的記錄子串行的適當位置。
public
void insertsort(list list)
list[j + 1] = temp;}}
}
直接插入排序演算法的時間複雜度分為最好、最壞和隨機三種情況:
(1) 最好的情況是順序表中的記錄已全部排好序。這時外層迴圈的次數為n-1,內層迴圈的次數為 0。這樣,外層迴圈中每次記錄的比較次數為 1,所以直接插入排序演算法在最好情況下的時間複雜度為 o(n)。
(2) 最壞情況是順序表中記錄是反序的。這時內層迴圈的迴圈係數每次均為 i。因此,直接插入排序演算法在最壞情況下的時間複雜度為o(n2)。
(3) 如果順序表中的記錄的排列是隨機的,則記錄的期望比較次數為n2/4。因此,直接插入排序演算法在一般情況下的時間複雜度為o(n2)。
可以證明,順序表中的記錄越接近於有序,直接插入排序演算法的時間效率越高,其時間效率在o(n)到o(n2)之間。
直接插入排序演算法的空間複雜度為 o(1)。因此,直接插入排序演算法是一種穩定的排序演算法。
氣泡排序
氣泡排序(bubble sort)的基本思想是:將相鄰的記錄的關鍵碼進行比較,若前面記錄的關鍵碼大於後面記錄的關鍵碼,則將它們交換,否則不交換。
public
void bunblesort(list list)}}
}
氣泡排序演算法的最好情況是記錄已全部排好序,這時,迴圈 n-1 次,每次迴圈都因沒有資料交換而退出。因此,氣泡排序演算法在最好情況下的時間複雜度為o(n)。
氣泡排序演算法的最壞情況是記錄全部逆序存放,總的移動次數為比較次數的 3 倍,因為被進行一次比較,需要進行 3 次移動。因此,氣泡排序演算法在最壞情況下的時間複雜度為o(n2)。
簡單選擇排序
簡單選擇排序(****** select sort)演算法的基本思想是:從待排序的記錄序列中選擇關鍵碼最小(或最大)的記錄並將它與序列中的第乙個記錄交換位置;然後從不包括第乙個位置上的記錄序列中選擇關鍵碼最小(或最大)的記錄並將它與序列中的第二個記錄交換位置;如此重複,直到序列中只剩下乙個記錄為止。
public
void ******sort(list list)
}temp = list[t];
list[t] = list[i];
list[i] = temp;
}}
在簡單選擇排序中,第一次排序要進行 n-1 次比較,第二次排序要進行 n-2次比較,第 n-1 排序要進行 1 次比較,在各次排序時,記錄的移動次數最好 0 次,最壞為 3 次,所以,總的移動次數最好為 0 次,最壞為 3 次。因此,簡單選擇排序演算法的時間複雜度為o(n2)。
快速排序
快速排序(quick sort)的基本思想是:通過不斷比較關鍵碼,以某個記錄為界(該記錄稱為支點),將待排序列分成兩部分。其中,一部分滿足所有記錄的關鍵碼都大於或等於支點記錄的關鍵碼,另一部分記錄的關鍵碼都小於支點記錄的關鍵碼。把以支點記錄為界將待排序列按關鍵碼分成兩部分的過程,稱為一次劃分。對各部分不斷劃分,直到整個序列按關鍵碼有序為止。
public
void quicksort(list list,int low,int high )
j--;
}while (iif (list[i]>temp)
}i++;}}
list[i] =temp;
quicksort(list, low, i - 1);
quicksort(list, i + 1, high);
}
快速排序演算法的時間複雜度和每次劃分的記錄關係很大。如果每次選取的記錄都能均分成兩個相等的子串行,這樣的快速排序過程是一棵完全二叉樹結構(即個結點都把當前待排序列分成兩個大小相當的子串行結點,n個記錄待排序列的根結點的分解次數就構成了一棵完全二叉樹),這時分解次數等於完全二叉樹的深度log2n。每次快速排序過程無論把待排序列這樣劃分,全部的比較次數都接近於n-1 次,所以,最好情況下快速排序的時間複雜度為o(nlog2n)。快速排序演算法的最壞情況是記錄已全部有序,此時n個記錄待排序列的根結點的分解次數就構成了一棵單右支二叉樹。所以在最壞情況下快速排序演算法的時間複雜度為o(n2)。一般情況下,記錄的分布是隨機的,序列的分解次數構成一棵二叉樹,這樣二叉樹的深度接近於log2n,所以快速排序演算法在一般情況下的時間複雜度為o(nlog2n)。 另外,快速排序演算法是一種不穩定的排序的方法。 資料結構 排序
小小總結了下 希望別不記得 排序型別 排序方法 平均時間 最壞時間 最好時間 穩定空間 插入直接插入 o n2 o n2 o n 穩定o 1 希爾排序 o n3 2 增量序列最後為1,只有公因子1 不穩o 1 選擇簡單選擇 o n2 o n2 o n 穩定o 1 堆排序o n lb n o n lb...
資料結構 排序
郝斌版 資料結構 學習筆記 冒泡 公升序,12比,大放後面,再23比,直至最大的在最後面 插入 2,3,4,依次插入值,保證插入值後的序列為有序的 選擇 後面所有的最小值依次排到最前 快速排序 歸併排序 22排,44排,88排.排序演算法標準 時間,空間,穩定性 排序和查詢的關係 排序是查詢的前提,...
資料結構 排序
1.希爾排序 shellsort 增量序列d n為要排序數的個數 void shellinsertsort int a,int n,int dk n個要排序的數,dk是增量 2 堆排序 已知h s m 除了h s 外均滿足堆的定義 調整h s 使其成為大頂堆.即將對第s個結點為根的子樹篩選,para...