排序(二) 快速排序 堆排序

2021-08-21 01:21:46 字數 3436 閱讀 9362

一、排序分析:

5、快速排序

時間複雜度:o(nlog2n)–有序–>o(n^2)

空間複雜度:o(log2n)

演算法穩定性:不穩定

//快速排序(分割槽、遞迴操作):固定位置選取基準法low、隨機選取(有序資料的優化)、三分選取 

//優化: 1、直接插入(少於100各元素) 2、聚集基準位置法

//取基準(分資料段):

//(1)low、high 對應元素比較交換(初始par 為首元素,l 為首元素,h為尾部元素),tmp存放l值(預設其左側均小於自身,右側均大於自身)

//(2)low++尋找大於基準的覆蓋high,--high尋找小於基準的覆蓋low

//(3)相遇點即基準位置,每趟l、h相遇即結束,將tmp值覆蓋相遇點,此時基準tmp之前均小於,之後均大於

////一趟快速排序的過程,結果得到新基準位置

int partion(int *arr, int low, int high)//基準位置

if(low < high)

//找到小於tmp的元素覆蓋arr[low]

else

while(low < high && arr[low] <= tmp)

if(low < high)

//找到大於tmp的元素覆蓋arr[high]

else

}arr[low] = tmp;//每趟結束(low、high相遇),此時為基準位置,重新恢復當前基準數值

return low;

}

void quick(int *arr, int start, int end)//遞迴

//左邊遞迴排序

if(par < end-1)

//右邊遞迴排序

}void quicksort(int *arr, int len)

//將每次找基準的數對存放在棧中

void quicksort_stack(int *arr, int len)//棧(用於存放數對,即每趟low、high的值)

//左if(par < high-1)

//右//出棧、第二次及以上數對入棧出棧

while(top > 0)

//左if(par < high-1)

//右}

}

6、堆排序

時間複雜度:o(nlog2n)

空間複雜度:o(1)

演算法穩定性:不穩定

//堆排序:大根堆

//(1)預設無序陣列為完全二叉樹

//(2)構造大根堆:每次0號下標的元素即根節點確定為無序陣列中的最大值

// 子為n,求父:(n-1)/2

// 父為n,求子:左孩子2n+1;右孩子2n+2

//(3)交換根節點,再次調整構造大根堆

//整個排序過程由後至前開始有序排列

void adjust(int *arr, int start, int end)//一次調整(根節點為最大元素)

//存在子節點,並得到兩個子節點的最大值

if(arr[i] > tmp)

//子節點的最大值也大於父節點時,將最大值賦給父節點

else

}arr[start] = tmp;//遍歷結束後將tmp放置合適位置

}void heapsort(int *arr, int

len)//交換堆排序

//交換

int tmp =0;

for(int i =0; i < len

-1; i++)

}

二、**實現

#include

#include

#include

static

void swap(int *arr, int i, int j)

//快速排序

int partion(int *arr, int low, int high)//基準位置

if(low < high)

//找到小於tmp的元素覆蓋arr[low]

else

while(low < high && arr[low] <= tmp)

if(low < high)

//找到大於tmp的元素覆蓋arr[high]

else

}arr[low] = tmp;//每趟結束(low、high相遇),此時為基準位置,重新恢復當前基準數值

return low;

}void quick(int *arr, int start, int end)//遞迴

//左邊遞迴排序

if(par < end-1)

//右邊遞迴排序

}void quicksort(int *arr, int len)

//將每次找基準的數對存放在棧中

void quicksort_stack(int *arr, int len)//棧(用於存放數對,即每趟low、high的值)

//左if(par < high-1)

//右//出棧、第二次及以上數對入棧出棧

while(top > 0)

//左if(par < high-1)

//右}

}//堆排序

void adjust(int *arr, int start, int end)//一次調整(根節點為最大元素)

//存在子節點,並得到兩個子節點的最大值

if(arr[i] > tmp)

//子節點的最大值也大於父節點時,將最大值賦給父節點

else

}arr[start] = tmp;//遍歷結束後將tmp放置合適位置

}void heapsort(int *arr, int len)//交換堆排序

//交換

int tmp = 0;

for(int i = 0; i < len-1; i++)

}void show(int *arr, int len)

printf("\n");

}int main()

; int len = sizeof(arr) / sizeof(arr[0]);

heapsort(arr, len);

//quicksort(arr, len);

//quicksort_stack(arr, len);

show(arr, len);

getchar();

return

0;}

希爾排序,堆排序,快速排序

插入排序的改進演算法,不穩定的排序演算法,空間複雜度為o 1 public static void shellsort int a 氣泡排序的改進演算法,不穩定的排序演算法 空間複雜度在o log2n 和o n 之間 時間複雜度在o n 和o n2 之間,平均時間複雜度為o nlog2n 而當陣列初...

希爾排序,快速排序,堆排序

最近在準備資料結構的考試,於是用部落格記錄下自己複習的過程。今天的內容是三種高階排序。希爾排序 當序列增量為incr k 2 t k 1 1時,時間複雜度為o n1.5 以序列增量分組,對每組進行大小調整。templatevoid shellinsert t elem,int n,int incr ...

希爾排序,堆排序,快速排序

希爾排序 最優情況下 時間複雜度為 o n 1.3 最差的情況下為 o n 2 增量序列的最後乙個增量值必須等於1 shell sort vector v1 堆排序 void heapadjust int a,int m,int n for i n i 1 i 快速排序 快排在樞紐選取時可以優化,三...