死磕演算法之堆排序

2021-09-19 22:04:20 字數 2263 閱讀 1543

堆排序主要是運用了二叉樹的性質來進行的排序。

在進行堆排序之前我們先了解一下二叉樹的幾個性質:

1.在排序使用二叉樹的時候我們要排序的陣列的第0個位置其實是不可以用的,這個時候如果我們要排序的陣列為[3,1,0,2,8,4,2]時,我們首先要把它變為[0,3,1,0,2,8,4,2],我們把他轉換為二叉樹的時候是這樣的

2.觀察此二叉樹我們可以發現幾個公式:

3.我們進行堆排序的時候一般先從最後的節點開始,先比較最後的子節點,找出較大的子節點與父節點比較,如果子節點大於父節點則子節點與父節點交換。此流程大概是這樣的

明白了上方的概念以後我們可以就可以進行簡單的操作了:

由公式所知,我們父節點的索引個數等於父節點個數(等於(陣列長度8-1)/2)3個,那麼最後乙個父節點的索引就是3.

有了父節點索引我們就可以得到他的左孩子和右孩子的索引分別為6和7

我們先假設左孩子是子節點最大的,然後判斷一下右孩子是否存在,如果存在再比較左右孩子得出最小的孩子。

比較最小孩子和父節點。如果孩子節點大於父節點則交換。

索引為3的父節點比較完了接著比較索引為2的父節點。。然後是為1的。

現在整個樹上最大的元素已經在跟節點了,那麼我們就把跟節點與最後乙個節點交換一下位置。

再次回到1開始比較,不過需要注意的這次我們要把陣列最後乙個忽略。

接下來上**

public

static

void

sort(int arr,int length)

for (int i=(length-1)/2;i>=1;i--)

if(arr[i]max])

}swap(arr,1,length-1);//將跟節點與陣列最後乙個節點交換

sort(arr,length-1);//遞迴呼叫此方法,不過排序好的就不需要再次比較了,所以忽略它

}public

static

void swap(int arr,int a ,int b)

public

static

void main(string args);

sort(arr,arr.length);

system.out.println(arrays.tostring(arr));

}

堆排序主要是運用了二叉樹的性質來進行的排序。

在進行堆排序之前我們先了解一下二叉樹的幾個性質:

1.在排序使用二叉樹的時候我們要排序的陣列的第0個位置其實是不可以用的,這個時候如果我們要排序的陣列為[3,1,0,2,8,4,2]時,我們首先要把它變為[0,3,1,0,2,8,4,2],我們把他轉換為二叉樹的時候是這樣的

2.觀察此二叉樹我們可以發現幾個公式:

3.我們進行堆排序的時候一般先從最後的節點開始,先比較最後的子節點,找出較大的子節點與父節點比較,如果子節點大於父節點則子節點與父節點交換。此流程大概是這樣的

明白了上方的概念以後我們可以就可以進行簡單的操作了:

由公式所知,我們父節點的索引個數等於父節點個數(等於(陣列長度8-1)/2)3個,那麼最後乙個父節點的索引就是3.

有了父節點索引我們就可以得到他的左孩子和右孩子的索引分別為6和7

我們先假設左孩子是子節點最大的,然後判斷一下右孩子是否存在,如果存在再比較左右孩子得出最小的孩子。

比較最小孩子和父節點。如果孩子節點大於父節點則交換。

索引為3的父節點比較完了接著比較索引為2的父節點。。然後是為1的。

現在整個樹上最大的元素已經在跟節點了,那麼我們就把跟節點與最後乙個節點交換一下位置。

再次回到1開始比較,不過需要注意的這次我們要把陣列最後乙個忽略。

接下來上**

public

static

void

sort(int arr,int length)

for (int i=(length-1)/2;i>=1;i--)

if(arr[i]max])

}swap(arr,1,length-1);//將跟節點與陣列最後乙個節點交換

sort(arr,length-1);//遞迴呼叫此方法,不過排序好的就不需要再次比較了,所以忽略它

}public

static

void swap(int arr,int a ,int b)

public

static

void main(string args);

sort(arr,arr.length);

system.out.println(arrays.tostring(arr));

}

死磕演算法之選擇排序

假如我們現在要排序的陣列為 3,1,0,2,8,4,2 那麼選擇排序的排序流程為 在這個陣列中找出最小值與第乙個元素交換,現在陣列為 0,1,3,2,8,4,2 在這個陣列中除了第乙個位置的元素外找出最小值與第二個元素交換,因為第二個元素就是最小的所以此次沒有發生變化。現在陣列為 0,1,3,2,8...

死磕演算法之快速排序

快速排序是乙個運用了分治法和遞迴演算法的排序方式。假如我們現在要排序的陣列為 3,1,0,2,8,4,2 那麼在進行快速排序的時候我們先要進行一些準備 下面開始排序 先從陣列右邊開始,我們發現j指向的元素2比標桿n小,那麼我們將j指向的元素賦值給i指向的元素,停止操作。此時陣列為 2,1,0,2,8...

死磕演算法之插入排序

相信大家都有打撲克的經歷,那麼我們今天的插入排序就以拿牌為例開始講 注意只是舉例,不是按打牌的規則哦 1.我們拿到了一張牌3,我們把它放手裡,現在手裡有牌 3 2.我們拿到了一張牌1,拿它與手裡最後一張牌也就是3比較,發現1比3小,所以我們把它插入到3的前面,現在手裡有牌 1,3 3.我們拿到了一張...