一、排序分析:
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 快速排序 快排在樞紐選取時可以優化,三...