選擇排序與冒泡排序很接近框冀,但是選擇排序并不急于把兩次比較中的結(jié)果交換位置。冒泡排序每比較一次,就會交換一次位置裸扶;選擇排序是首先把第一個數(shù)的下標定義為比較對象,讓它與之后最符合條件的數(shù)字進行比較搬素,若后面的數(shù)值大于第一個數(shù)呵晨,將后面數(shù)字與第一個數(shù)交換。
簡單來說就是冒泡排序是1 VS 1熬尺,這兩個數(shù)中符合條件的前進摸屠,冒泡排序時1?VS 全部,后者符合條件粱哼,則把后者的值賦給前者季二,后者不符合條件,則不進行比較揭措,無法進入for循環(huán)胯舷。
還用這幾個數(shù)進行排序:
12,45,10,6,9,5,34
首先它們對應的下標是從開始,0,1,2,3,4,5,6.
選擇排序:12是第一個數(shù)绊含,下標為0桑嘶,與45比較,45大于12躬充,將45的值賦給12逃顶。
12大于10,不進行變動充甚。
排序過程:12,45,10,6,9,5,34
(1)?5 45 10 6 9?12 34?? 第一個數(shù)與余下的最小值交換
(2) 5 6? 45? 9? 12? 34??? 第二個數(shù)與余下的最小值交換
(3) 5?6? 9? 45? 12? 34??? 第三個數(shù)與余下的最小值交換
(4)5? 6? 9? 12? 45? 34??? 第四個數(shù)與余下的最小值交換
(5)5? 6? 9? 12? 34? 45????第五個數(shù)字余下的最小值交換
選擇排序代碼:
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) {
??//參數(shù)合法性判斷
??if (arr == null || arr.length == 0) {
???System.out.println("Input Param is invalid!");
???return false; //表示函數(shù)運行失敗
??}
??
??//循環(huán)的問題
??
??
??//核心代碼需要循環(huán)9次才能確定數(shù)據(jù)排序成功以政,此處為從大到小排序
??for (int i = 0; i < arr.length - 1; i++) {
??//核心代碼
???int index = i;
???//找出數(shù)組中剩余數(shù)據(jù)的最大值,放到對應的位置
???for (int j = i + 1; j < arr.length; j++) {
????if (arr[index] < arr[j]) {
?????index = j;
???
????}
???}??
???
???//i就是每一次要對應的位置
???if (index != i) {//這里是把最大值賦給前面的數(shù)伴找,盈蛮,如果index==i,則不需要移動位置技矮。index已經(jīng)是最大值所咋的下標抖誉,如//果==i,沒有移動的必要
????int temp = arr[index];
????arr[index] = arr[i];
????arr[i] = temp;
???}
??}
??
??return true;
?}
?
?
?/* -------------------------------------------------------------------??? */
?/**
??需求:找出數(shù)組位處理數(shù)據(jù)中最大的元素穆役,和下標為1的元素互換位置
??參數(shù): int[] arr? 表示要傳入的數(shù)組【首地址】
??返回值: boolean 返回true 表示函數(shù)運行成功寸五,返回false表示函數(shù)運行失敗
???1、傳入的數(shù)組首地址是null
???2耿币、傳入的數(shù)組長度為0
?*/
?public static boolean putMaxAtSecondIndex(int[] arr) {
??//參數(shù)合法性判斷
??if (arr == null || arr.length == 0) {
???System.out.println("Input Param is invalid!");
???return false; //表示函數(shù)運行失敗
??}
??
??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;
??
?}
?
?
?/**
??需求:找出數(shù)組中最大的元素梳杏,和下標為0的元素互換位置
??參數(shù): int[] arr? 表示要傳入的數(shù)組【首地址】
??返回值: boolean 返回true 表示函數(shù)運行成功,返回false表示函數(shù)運行失敗
???1、傳入的數(shù)組首地址是null
???2十性、傳入的數(shù)組長度為0
?*/
?public static boolean putMaxAtFirstIndex(int[] arr) {
??//參數(shù)合法性判斷
??if (arr == null || arr.length == 0) {
???System.out.println("Input Param is invalid!");
???return false; //表示函數(shù)運行失敗
??}
??
??//獲取最大值的下標 利用for循環(huán)找出數(shù)組中最大值下標的操作
??int index = 0; //用index保存數(shù)組中的最大值下標
??for (int i = 1; i < arr.length; i++) {
???if (arr[index] < arr[i]) {
????index = i;
???}
??} //這個循環(huán)結(jié)束叛溢,就可以找出數(shù)組中最大值的下標
??
??//和下標為0的元素互換位置
??if (index != 0) {
???int temp = arr[index];
???arr[index] = arr[0];
???arr[0] = temp;
??}
??
??return true;
?}
?
?/**
??功能:從鍵盤上獲取十個int類型的數(shù)據(jù)放入數(shù)組
??參數(shù): int[] array? 表示要傳入的數(shù)組【首地址】
??返回值: boolean 返回true 表示函數(shù)運行成功,返回false表示函數(shù)運行失敗
???1劲适、傳入的數(shù)組首地址是null
???2楷掉、傳入的數(shù)組長度為0
?*/
?public static boolean getNumFromStdin(int[] array) {
??//參數(shù)合法性判斷
??if (array == null || array.length == 0) {
???System.out.println("Input Param is invalid!");
???return false; //表示函數(shù)運行失敗
??}
??
??Scanner sc = new Scanner(System.in);
??System.out.println("請輸入" + array.length + "個數(shù):");
??
??for (int i = 0; i < array.length; i++) {
???array[i] = sc.nextInt();
??}
??
??return true;
?}
?
?
?
?/**
??功能:展示指定的int類型的數(shù)組
??參數(shù): int[] array? 表示要傳入的數(shù)組【首地址】
??返回值: void
??如果函數(shù)沒有打印數(shù)組,存在兩種情況:
???1霞势、傳入的數(shù)組首地址是null
???2烹植、傳入的數(shù)組長度為0
?*/
?public static void printArray(int[] array) {
??//參數(shù)合法性判斷
??if (array == null || array.length == 0) {
???System.out.println("Input Param is invalid!");
???return; //傳入?yún)?shù)不合法,結(jié)束函數(shù)運行
??}
??
??//利用for循環(huán)打印數(shù)組
??for (int i = 0; i < array.length; i++) {
???System.out.println("array[" + i + "] = " + array[i]);
??}
??//這里可以不用寫return 因為函數(shù)么有返回值
?}
}
?