選擇排序屬於內部排序法, 是從想要排序的資料中, 按指定的規則選出某乙個元素, 再依規定的交換位置後達到排序的目的選擇排序(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個元素中找到最小的元素,如果它不是排在第乙個,就讓它與第乙個元素交換位置。第二輪再在除去最前面的元素 也就是上一輪找到的最小元素 中,再找到最小的元素,使它的位置確定在當前這些元素的最前面。以此類推。每一輪都可以確定乙個元素的位置,只需要...
資料結構 排序演算法之選擇排序
一 選擇排序 最差的排序演算法 在選擇排序中,假定我們需要公升序,因此在每次排序中,需要找到最大的元素,將其放在最後,在每一次的迴圈中,都是將最大的元素放在最後,因此對於資料較多的陣列,迴圈的次數將與陣列中元素的個數一致,因此,在對於這種陣列進行排序時,將十分的浪費時間。有關選擇排序的思路,如下所示...