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

2021-10-02 11:31:41 字數 4274 閱讀 2896

選擇排序屬於內部排序法, 是從想要排序的資料中, 按指定的規則選出某乙個元素, 再依規定的交換位置後達到排序的目的

選擇排序(select sorting)也是一種簡單的排序方法。它的基本思想是:

第一次從arr[0]~arr[n-1]中選取最小值,與arr[0]交換,

第二次從arr[1]~arr[n-1]中選取最小值,與arr[1]交換,

第三次從arr[2]~arr[n-1]中選取最小值,與arr[2]交換,…,

第i次從arr[i-1]~arr[n-1]中選取最小值,與arr[i-1]交換,…,

第n-1次從arr[n-2]~arr[n-1]中選取最小值,與arr[n-2]交換,總共通過n-1次,得到乙個按排序碼從小到大排列的有序序列。

思路**

實現**

/**

* 選擇排序(正序)-時間複雜度 o(n^2),空間複雜度o(1)

* * @author timepause

* @create 2020-02-01 11:39

*/public

class

selectsort

;selectsort

(arr)

;system

.out.

println

(arrays

.tostring

(arr));

}public

static

void

selectsort

(int arr)

}// 將最小值, 放在arr[i],作用是交換元素. 然後執行下一次大迴圈

if(minindex!=i)

/* system.out.println("第"+(i+1)+"次排排結果");

system.out.println(arrays.tostring(arr));*/}}

}

2021.06.15 選擇排序簡化思路定義最小元素下標 minindex = i, 最小元素值 minval = arr[i] (下標只是輔助, 陣列中元素的值才是關鍵!)

通過兩層迴圈比較所有元素的值, 如果前面大於後面則將後面元素下標和值都賦值給後面(作用是按照從小到大排列)

在內層迴圈結束後, 判斷當前元素下標和外層迴圈下標是否一致, 不一致則說明最小元素已傳送改變,則進行互換, 不使用temp而直接使用下標和值的方式

/**

* 選擇排序簡化思路

* 1. 定義最小元素下標 minindex = i, 最小元素值 minval = arr[i];

* 2. 通過兩層迴圈比較所有元素的值, 如果前面大於後面則將後面元素下標和值都賦值給後面

* 3. 在內層迴圈結束後, 判斷當前元素下標和外層迴圈下標是否一致, 不一致則說明最小元素已傳送改變,則進行互換,

* 不使用temp而直接使用下標和值的方式

* @param arr

*/public

static

void

selectsort5

(int

arr)

}//3. 在內層迴圈結束後, 判斷當前元素下標和外層迴圈下標是否一致, 不一致則說明最小元素已傳送改變,則進行互換

// 不使用temp而直接使用下標和值的方式

if(minindex != i)

}}

堆排序是基於二叉樹實現的, 因此在學習堆排序時, 最好先學習一下樹這種結構結構

大頂堆舉例說明

小頂堆舉例說明

小頂堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] // i 對應第幾個節點,i從0開始編號

堆排序基本思想可以看到在構建大頂堆的過程中,元素的個數逐漸減少,最後就得到乙個有序序列了.

要求:給你乙個陣列 , 要求使用堆排序法,將陣列公升序排序。

**實現

/**

* 堆排序(公升序)實現

* * @author timepause

* @create 2020-02-16 12:12

*/public

class

heapsort

;heapsort

(arr)

;system

.out.

println

(arrays

.tostring

(arr));

/* // 建立要給80000個的隨機的陣列

int arr = new int[8000000];

for (int i = 0; i < 8000000; i++)

system.out.println("排序前");

date data1 = new date();

******dateformat ******dateformat = new ******dateformat("yyyy-mm-dd hh:mm:ss");

string date1str = ******dateformat.format(data1);

system.out.println("排序前的時間是=" + date1str);

heapsort(arr);

date data2 = new date();

string date2str = ******dateformat.format(data2);

system.out.println("排序前的時間是=" + date2str);

"排序後=" + arrays.tostring(arr));*/

}//編寫乙個堆排序的方法

public

static

void

heapsort

(int arr)

/* * 2).將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;

3).重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。

*/for(

int j = arr.length-

1;j >

0; j--

)"陣列=" + arrays.tostring(arr));

}/**

* 將乙個陣列(二叉樹), 調整成乙個大頂堆

* 功能: 完成 將 以 i 對應的非葉子結點的樹調整成大頂堆

* 舉例 int arr = ; => i = 1 => adjustheap => 得到

* 如果我們再次呼叫 adjustheap 傳入的是 i = 0 => 得到 =>

* @param arr 待調整的陣列

* @param i 非葉子結點在陣列中索引

* @param length 對多少個元素繼續調整, length 是在逐漸的減少

*/public

static

void

adjustheap

(int arr,

int i,

int length)

if(arr[k]

> temp)

else

}//當for 迴圈結束後,我們已經將以i 為父結點的樹的最大值,放在了最頂(區域性)

arr[i]

= temp;

//將temp值放到調整後的位置

}}

堆排序處理800w資料用時3-4秒左右, 可以看出, 堆排序效率也是比較高的

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

1.什麼是選擇排序 我的理解 從左向右一次推舉中陣列中的最值,推舉的方式是 第一次選擇所有元素的最值放到陣列左邊第一位,第二次再從剩下的元素中選擇最值放到第二位,依此類推,直到排出陣列的順序為止 2.由小到大排序,陣列為 3,4,1,5,2 選擇排序 public class selectsort ...

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

選擇排序的基本思想是 如果共有n個元素,那麼第一輪的時候就再n個元素中找到最小的元素,如果它不是排在第乙個,就讓它與第乙個元素交換位置。第二輪再在除去最前面的元素 也就是上一輪找到的最小元素 中,再找到最小的元素,使它的位置確定在當前這些元素的最前面。以此類推。每一輪都可以確定乙個元素的位置,只需要...

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

一 選擇排序 最差的排序演算法 在選擇排序中,假定我們需要公升序,因此在每次排序中,需要找到最大的元素,將其放在最後,在每一次的迴圈中,都是將最大的元素放在最後,因此對於資料較多的陣列,迴圈的次數將與陣列中元素的個數一致,因此,在對於這種陣列進行排序時,將十分的浪費時間。有關選擇排序的思路,如下所示...