單邊迴圈(小灰的演算法之旅)
第一次寫部落格咯!容我先絮絮叨叨一會兒哈哈哈。
以前總是上論壇看別人的**,也寫、改過一些**,但都瞎存在硬碟裡沒有整理歸納,即使**跑通了、自己思考過也印象不深。寫部落格做記錄、複述程式設計思想有利於加深理解,也可以和廣大優秀的夥伴們討論我理解中的不足。
言歸正傳,本文放上堆排序和快速排序的**。
從資料的儲存結構看,最大堆/最小堆是乙個陣列。
從資料的邏輯結構看,最大堆/最小堆是一棵完全二叉樹.
heap屬性:父節點大於子節點,若完全二叉樹滿足此性質則為heap
【siftdown】
**功能:**實現以該節點為父的所有子樹均成堆。
**實現方法:**將父節點與較大子節點交換(與下層元素交換),對交換後打破的原平衡(該子節點失衡,但該子節點以下依然保持原序)遞迴siftdown調整。
提供2種方法,分別為遞迴和非遞迴(迴圈法)。
**使用前提:**二叉樹需要滿足較嚴格的條件,該父節點與其子節點可能不滿足heap性質,但其子節點以下均滿足heap性質。
【heapify】
**功能:**亂序二叉樹成堆,擁有heap屬性。
**實現方法:**從最後乙個非葉子節點起,按層序反向遍歷siftdown,遍歷過的節點以下全部出成堆。
【heapsort】
**功能:**堆排序。實現方法:首先heapify將亂序數組成堆,堆頂為陣列最大值,將其拎出,與陣列末端元素交換,最大值置於陣列末端。此時原末端資料置於堆頂,堆頂父節點失衡,進行siftdown,使長度為length-1的陣列重新成堆。以此類推。
【siftup】
功能:乙個個往堆中插入元素;若大於父節點,則與上層元素交換。這裡暫時沒用到。
heapsort.cpp
#include
#include
using
namespace std;
void
myswap
(vector<
int>
& nums,
int index1,
int index2)
void
printarray
(vector<
int>
& nums)
cout
siftdown
(vector<
int>
& nums,
int parent,
int length)
int child1=
2*parent+1;
int child2=
2*parent+2;
int max=parent;
if(nums[child1]
>nums[max]
&&child1//先判斷左孩子
if(nums[child2]
>nums[max]
&&child2if(max!=parent)
}void
heapify
(vector<
int>
& nums,
int length)
return;}
void
heapsort
(vector<
int>
& nums,
int length)
}int
main()
;printarray
(arr)
;// siftdown(arr,0,arr.size());
// printarray(arr);
// heapify(arr,arr.size());
// printarray(arr);
heapsort
(arr,arr.
size()
);printarray
(arr)
;return0;
}
siftdown不用遞迴的方法:
heapsort2.cpp
void
siftdown
(vector<
int>
& nums,
int parent,
int length)
if(child2>nums[max]
)//記得防止越界啊!加上判斷條件!
if(parent!=max)
else
return
; parent=max;
child1=
2*parent+1;
}}
分治:
以第乙個元素為pivot,兩個指標分別從陣列前端、末端向中間遍歷。當左指標left所指資料》pivot以及right所指自己寫的,分治演算法先搜尋左邊
quicksort2.cpp
因為若重合指標所指的數>pivot,再交換所得序列就有問題,所以額外加了兩個判斷,以使left-1所指與pivot交換。。。
#include
#include
using
namespace std;
void
myswap
(vector<
int>
& nums,
int index1,
int index2)
void
printarray
(vector<
int>
& nums)
cout<}int
mypartition
(vector<
int>
& arr,
int startindex,
int endindex)
if(arr[right]
>=pivot)
myswap
(arr,left,right)
; left++
; right--;}
if(arr[left]
<=pivot)
else
pivotindex=right;
myswap
(arr,startindex,pivotindex)
;return pivotindex;
}void
quicksort
(vector<
int>
& arr,
int startindex,
int endindex)
//遞迴函式
int pivotindex=
mypartition
(arr,startindex,endindex)
;quicksort
(arr,startindex,pivotindex-1)
;quicksort
(arr,pivotindex+
1,endindex);}
intmain()
;printarray
(arr)
;//cout<<"6 is in pos "(arr,
0,arr.
size()
-1);
printarray
(arr)
;return0;
}
常規演算法,分治演算法先搜尋右邊
參考演算法之旅,自己改的
int
mypartition
(vector<
int>
& arr,
int startindex,
int endindex)
while
(arr[left]
<=pivot)
if(left// myswap(arr,left,right);//重合時交換無意義
}
pivotindex=right;
myswap
(arr,startindex,pivotindex)
;return pivotindex;
}
大話資料結構方法
partition_two_points.cpp
int
mypartition
(vector<
int>
& arr,
int startindex,
int endindex)
myswap
(arr,left,right)
;//比pivot小的交換到左邊
while
(left<=pivot)
myswap
(arr,left,right)
;//比pivot大的交換到右邊
}return left;
}
quicksort.cpp
int
mypartition
(vector<
int>
& arr,
int startindex,
int endindex)
} arr[startindex]
=arr[pivotindex]
; arr[pivotindex]
=pivot;
return pivotindex;
}
冒泡,快速,和堆排序
1 主程式 cpp檔案 2 include 3 include 4 include 5 include 6 include 7 include bobblesort.h 8 include quicksort.h 9 include heapsort.h 10 11int main 1255 get...
希爾排序,堆排序,快速排序
插入排序的改進演算法,不穩定的排序演算法,空間複雜度為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 ...