選擇排序:是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。 原理:首先用第一個元素和後面的每一個元素進行比較,如果後面有比第一個元素小的就交換這兩個元素 比較下來會得到第最小的一個元素,放在第一個位置,然後依次拿著後面每一個元素依次這樣比 ...
選擇排序:是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。
原理:首先用第一個元素和後面的每一個元素進行比較,如果後面有比第一個元素小的就交換這兩個元素
比較下來會得到第最小的一個元素,放在第一個位置,然後依次拿著後面每一個元素依次這樣比較,
每次都會得到一個最小的元素,排序完就是從小到大排序
例如:int[] arr={31,23,79,65,16} arr.length=5,將這個數組arr安照選擇排序演算法來重新排序
思路分析:
第一輪比較: i=0時,j=1,2,3,4 (即j=1;j<5;j++)
{31,23,79,65,16} 31>23 交換 arr[0]與arr[1]比較--->j=1:arr[0] 比 arr[1]=arr[j]
{23,31,79,65,16} 23<79 不交換 arr[0]與arr[2]比較--->j=2:arr[0] 比 arr[2]=arr[j]
{23,31,79,65,16} 23<65 不交換 arr[0]與arr[3]比較--->j=3:arr[0] 比 arr[3]=arr[j]
{23,31,79,65,16} 23>16 交換 arr[0]與arr[4]比較--->j=4:arr[0] 比 arr[4]=arr[j]
最終排序{16,31,79,65,23}得出一個最小元素arr[0]=16放在首位 i=0,arr[0]=arr[i]
第二輪比較: i=1時,j=2,3,4 (即j=2;j<5;j++)
{31,79,65,23} 31<79 不交換 arr[1]與arr[2]比較--->j=2:arr[1] 比 arr[2]
{31,79,65,23} 31<65 不交換 arr[1]與arr[3]比較--->j=3:arr[1] 比 arr[3]
{31,79,65,23} 31>23 交換 arr[1]與arr[4]比較--->j=4:arr[1] 比 arr[4]
最終排序{23,79,65,31} 得出一個最小元素arr[1]=23 此時還是arr[i]與arr[j]相比
第三輪比較: i=2時,j=3,4 (即j=3;j<5;j++)
{79,65,31} 79>65 交換 arr[2]與arr[3]比較--->j=3:arr[2] 比 arr[3]
{65,79,31} 65>31 交換 arr[2]與arr[4]比較--->j=4:arr[2] 比 arr[4]
最終排序{31,79,65} 得出一個最小元素arr[2]=31 此時還是arr[i]與arr[j]相比
第四輪比較: i=3時,j=4 (即j=4;j<5;j++)
{79,65} 79>65 交換 arr[3]與arr[4]比較--->j=4:arr[2] 比 arr[4]
最終得出小的元素是arr[3]=65
i=0時,j=1,2,3,4 (即j=1;j<5;j++) i=0,?=1
i=1時,j=2,3,4 (即j=2;j<5;j++)-->j=?;j<5;j++ i=1,?=2 ======》?=i+1
i=2時,j=3,4 (即j=3;j<5;j++) i=2,?=3
i=3時,j=4 (即j=4;j<5;j++) i=3,?=4
從上面可以看出還是四輪迴圈,每輪裡面又進行迴圈,外層是i=0;i<arr.length-1;i++
而內層是j=i+1;j<arr.length;j++
代碼實現如下:
public class ArrayDemo{
public static void main(String[] args){
//1.定義一個數組
int[] arr={31,23,79,65,16};
//2.調用selectSort方法
selectSort(arr);
//3.將排序完的數組列印出來,即遍歷
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
//將上述第二步拿下來定義成一個方法
//參數:方法裡面不斷改變的值,即數組,隨便給一個數組都可以用這個方法排序
//返回值:最後結果是排序數組,沒有計算值,不需要返回值
public static void selectSort(int[] arr){
//2.用選擇排序對數組進行排序
for(int i=0; i<arr.length-1; i++){ //控制外層迴圈
for(int j=i+1; j<arr.length; j++){ //控制裡層迴圈
if(arr[i]>arr[j]){ //迴圈裡面將arr[i]與arr[j]相比,滿足條件就交換
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
}