排序的穩定性:穩定和不穩定
穩定排序:冒泡、直接插入、歸併
不穩定排序:簡單選擇、希爾排序、堆排序、快速排序
內排序和外排序:
內排序在整個排序過程中,待排序的所有記錄全部被房子在記憶體中。外排序是由於排序的記錄個數太多,不能同時放置在記憶體,整個排序過程需要在內外存之間多次交換資料才能進行。
內排序,排序演算法的效能影響因素:
(1)時間效能
(2)輔助空間
(3)演算法複雜性
內排序:
插入排序(直接插入、希爾排序)
交換排序(氣泡排序、快速排序)
選擇排序(簡單選擇、堆排序)
歸併排序(歸併排序)
根據演算法複雜度可分為兩大類:簡單演算法和改進演算法
簡單演算法:氣泡排序、簡單選擇排序、直接插入排序
改進演算法:希爾排序、堆排序、歸併排序、快速排序
基本思想:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。
三種氣泡排序:
(1)不標準的氣泡排序:乙個和全部的進行兩兩比較
(2)標準的氣泡排序:每次都是相鄰兩兩比較
(3)優化的氣泡排序:設定標誌位,在已經有序的情況下不再進行多餘的比較
(交換排序類)
穩定性:穩定排序
時間複雜度:o(n2)
//不是很標準的氣泡排序
public static void bubblesort1(int array) }}
} //標準的氣泡排序
public static void bubblesort2(int array) }}
} //優化後的氣泡排序
public static void bubblesort3(int array) }}
}
基本思想:通過n-i次關鍵字的比較,從n-i+個記錄中選出關鍵字最小的記錄,並和第i個記錄交換。
(和上面那個不標準的氣泡排序有點像,但是選擇排序針對的是陣列下標)
(選擇排序類)
穩定性:不穩定排序
時間複雜度:o(n2)
//簡單選擇排序
public static void ******selectsort(int array)
}if(i!=min)
} }
基本思想:將乙個記錄插到已經排好序的有序表中,從而得到乙個新的、記錄數增1的有序表。
(插入排序類)
穩定性:穩定排序
時間複雜度:o(n2)
//直接插入排序
public static void straightinsertsort(int a)
a[k+1]=temp;
}} }
基本思想:縮小增量排序
(插入排序的公升級,插入排序類)
穩定性:不穩定排序
時間複雜度:o(n3/2)
//希爾排序
public static void shellsort(intlist)
//調整堆結構+交換堆頂元素和末尾元素
for(int j=arr.length-1;j>0;j--)
} //調整大頂堆
public static void adjustheap(int arr,int i,int length) else
} arr[i]=temp;//將temp值放到最終的位置
} //交換元素
public static void swap(int arr,int a,int b)
基本思想:n個有序的子串行,兩兩歸併。2路歸併排序
穩定性:穩定排序
時間複雜度:o(nlogn)
空間複雜度:o(n)
//歸併排序
public static void mergesort(int arr)
private static void mergesort(int arr,int left,int right,int temp)
if(i//從左往右比較
while(iif(i}
a[i]=x;
quicksort(a,l,i-1);
quicksort(a,i+1,r);
} }
資料結構 排序
小小總結了下 希望別不記得 排序型別 排序方法 平均時間 最壞時間 最好時間 穩定空間 插入直接插入 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...