快速排序和堆排序

2021-10-08 18:47:10 字數 4791 閱讀 3344

單邊迴圈(小灰的演算法之旅)

第一次寫部落格咯!容我先絮絮叨叨一會兒哈哈哈。

以前總是上論壇看別人的**,也寫、改過一些**,但都瞎存在硬碟裡沒有整理歸納,即使**跑通了、自己思考過也印象不深。寫部落格做記錄、複述程式設計思想有利於加深理解,也可以和廣大優秀的夥伴們討論我理解中的不足。

言歸正傳,本文放上堆排序和快速排序的**。

從資料的儲存結構看,最大堆/最小堆是乙個陣列。

從資料的邏輯結構看,最大堆/最小堆是一棵完全二叉樹.

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 ...