資料結構和演算法 排序演算法之二 選擇排序和堆排序

2021-07-07 09:51:45 字數 1153 閱讀 3007

一  選擇排序

(1)思想

假設有十張撲克牌放在桌上,我們需要按從小到大的順序拿到手上,每次只能選擇一張牌拿到手上,那麼每一次我們都必須從桌上的撲克牌中選擇最小的牌拿起來,一次迴圈十次,這樣就將撲克牌按從小到的順序拿到手上了。這就是選擇排序。

(2)實現

//選擇排序

//輸入:待排序陣列(a)和陣列個數(n)

//輸出:按從小到大排序的陣列(a)

void select_sort(sortarray *a,int n)

} if (i != min)

}}

選擇排序優於氣泡排序,其比較次數減少了,但是其演算法複雜度依然是o(n2).

二  堆排序演算法

(1)  思想

在選擇排序中,我們每次從待排序陣列中選擇最小的數是根據遍歷陣列比較得來的,這種方法的效率低。

在堆排序中,利用最小/最大堆來獲取待排序陣列的最小/最大值。

(2)  實現

在堆排序中,最重要的是構建最大堆。

//構建 最大堆

void heap_adjust(sortarray *a , int s , int n)

if (temp > (*a)[i])

(*a)[s] = (*a)[i];

s=i;

} (*a)[s] = temp;

}

構建最大堆的時間複雜度0(n)

堆排序演算法

void heap_sort(sortarray *a,int n)

for (i = 0 ; i =0 ; i--)

}

在堆排序中,需要反覆重建最大堆,其時間複雜度為o(nlogn)

所以,總時間複雜度為o(nlogn),其優於氣泡排序和選擇排序等。

附:主程式**

#include #include "stdafx.h"

#include using namespace std;

#define max 100

typedef int sortarray[max];

int _tmain(int argc, _tchar* argv)

cout<<"正在排序請稍後....."<

資料結構和演算法 選擇排序

每一趟從待排序的資料元素中選出最小 或最大 的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。把最小元素移動到放在已排好序的數列的最後 exch a,i,min public static boolean less comparable c1,comparable c2 pub...

資料結構和演算法 選擇排序

1.第一次從陣列裡選擇最大或者最小的元素放在第一位。2.剩餘的元素中再找到最大或者最小的元素依次放在已排序的元素後面。選擇排序的示例動畫。紅色表示當前最小值,黃色表示已排序序列,藍色表示當前位置。git位址 public class selectsort selectsort arr sortuti...

資料結構 排序 選擇排序演算法

選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。選擇排序的主要優點與資料移動有關。如果某...