選擇排序

選擇排序與冒泡排序很接近,但是選擇排序并不急于把兩次比較中的結果交換位置。冒泡排序每比較一次,就會交換一次位置;選擇排序是首先把第一個數的下標定義為比較對象,讓它與之后最符合條件的數字進行比較,若后面的數值大于第一個數,將后面數字與第一個數交換。

簡單來說就是冒泡排序是1 VS 1,這兩個數中符合條件的前進,冒泡排序時1?VS 全部,后者符合條件,則把后者的值賦給前者,后者不符合條件,則不進行比較,無法進入for循環。

還用這幾個數進行排序:

12,45,10,6,9,5,34

首先它們對應的下標是從開始,0,1,2,3,4,5,6.

選擇排序:12是第一個數,下標為0,與45比較,45大于12,將45的值賦給12。

12大于10,不進行變動。

排序過程:12,45,10,6,9,5,34

(1)?5 45 10 6 9?12 34?? 第一個數與余下的最小值交換

(2) 5 6? 45? 9? 12? 34??? 第二個數與余下的最小值交換

(3) 5?6? 9? 45? 12? 34??? 第三個數與余下的最小值交換

(4)5? 6? 9? 12? 45? 34??? 第四個數與余下的最小值交換

(5)5? 6? 9? 12? 34? 45????第五個數字余下的最小值交換


選擇排序代碼:

import java.util.Scanner;

class MySort {
?public static void main(String[] args) {
??
??int[] arr = new int[10];
??
??boolean ret = getNumFromStdin(arr);
??if (ret) {
??
???selectSort(arr);
???printArray(arr);
??}
?}
?

?/*
??選擇排序 selectSort
?*/
?public static boolean selectSort(int[] arr) {
??//參數合法性判斷
??if (arr == null || arr.length == 0) {
???System.out.println("Input Param is invalid!");
???return false; //表示函數運行失敗
??}
??
??//循環的問題
??
??
??//核心代碼需要循環9次才能確定數據排序成功,此處為從大到小排序
??for (int i = 0; i < arr.length - 1; i++) {
??//核心代碼
???int index = i;
???//找出數組中剩余數據的最大值,放到對應的位置
???for (int j = i + 1; j < arr.length; j++) {
????if (arr[index] < arr[j]) {
?????index = j;
???
????}
???}??
???
???//i就是每一次要對應的位置
???if (index != i) {//這里是把最大值賦給前面的數,,如果index==i,則不需要移動位置。index已經是最大值所咋的下標,如//果==i,沒有移動的必要
????int temp = arr[index];
????arr[index] = arr[i];
????arr[i] = temp;
???}
??}
??
??return true;
?}
?
?
?/* -------------------------------------------------------------------??? */
?/**
??需求:找出數組位處理數據中最大的元素,和下標為1的元素互換位置
??參數: int[] arr? 表示要傳入的數組【首地址】
??返回值: boolean 返回true 表示函數運行成功,返回false表示函數運行失敗
???1、傳入的數組首地址是null
???2、傳入的數組長度為0
?*/
?public static boolean putMaxAtSecondIndex(int[] arr) {
??//參數合法性判斷
??if (arr == null || arr.length == 0) {
???System.out.println("Input Param is invalid!");
???return false; //表示函數運行失敗
??}
??
??int index = 1;
??
??for (int i = 2; i < arr.length; i++) {
???if (arr[index] < arr[i]) {
????index = i;
???}
??}??
??
??if (index != 1) {
???int temp = arr[index];
???arr[index] = arr[1];
???arr[1] = temp;
??}
??
??return true;
??
?}
?
?
?/**
??需求:找出數組中最大的元素,和下標為0的元素互換位置
??參數: int[] arr? 表示要傳入的數組【首地址】
??返回值: boolean 返回true 表示函數運行成功,返回false表示函數運行失敗
???1、傳入的數組首地址是null
???2、傳入的數組長度為0
?*/
?public static boolean putMaxAtFirstIndex(int[] arr) {
??//參數合法性判斷
??if (arr == null || arr.length == 0) {
???System.out.println("Input Param is invalid!");
???return false; //表示函數運行失敗
??}
??
??//獲取最大值的下標 利用for循環找出數組中最大值下標的操作
??int index = 0; //用index保存數組中的最大值下標
??for (int i = 1; i < arr.length; i++) {
???if (arr[index] < arr[i]) {
????index = i;
???}
??} //這個循環結束,就可以找出數組中最大值的下標
??
??//和下標為0的元素互換位置
??if (index != 0) {
???int temp = arr[index];
???arr[index] = arr[0];
???arr[0] = temp;
??}
??
??return true;
?}
?
?/**
??功能:從鍵盤上獲取十個int類型的數據放入數組
??參數: int[] array? 表示要傳入的數組【首地址】
??返回值: boolean 返回true 表示函數運行成功,返回false表示函數運行失敗
???1、傳入的數組首地址是null
???2、傳入的數組長度為0
?*/
?public static boolean getNumFromStdin(int[] array) {
??//參數合法性判斷
??if (array == null || array.length == 0) {
???System.out.println("Input Param is invalid!");
???return false; //表示函數運行失敗
??}
??
??Scanner sc = new Scanner(System.in);
??System.out.println("請輸入" + array.length + "個數:");
??
??for (int i = 0; i < array.length; i++) {
???array[i] = sc.nextInt();
??}
??
??return true;
?}
?
?
?
?/**
??功能:展示指定的int類型的數組
??參數: int[] array? 表示要傳入的數組【首地址】
??返回值: void
??如果函數沒有打印數組,存在兩種情況:
???1、傳入的數組首地址是null
???2、傳入的數組長度為0
?*/
?public static void printArray(int[] array) {
??//參數合法性判斷
??if (array == null || array.length == 0) {
???System.out.println("Input Param is invalid!");
???return; //傳入參數不合法,結束函數運行
??}
??
??//利用for循環打印數組
??for (int i = 0; i < array.length; i++) {
???System.out.println("array[" + i + "] = " + array[i]);
??}
??//這里可以不用寫return 因為函數么有返回值
?}
}


?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容