数据结构 排序 java_Java数据结构之排序---选择排序
簡單選擇排序的介紹:
從給定的序列中,按照指定的規則選出某一個元素,再根據規定交換位置后達到有序的目的。
簡單選擇排序的基本思想:
假定我們的數組為int [] arr = new int[n],第一次我們從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次的交換,從而得到一個由小到大的排序序列。
簡單選擇排序的思路詳解:
例子:原始的數組:[101,34,119,1]
經過第一次選擇排序之后,我們得到的數組:1,[34,119,101]
經過第二次選擇排序之后,我們得到的數組:1,34,[119,101]
經過第三次選擇排序之后,我們得到的數組:1,34,101,[119]
這個時候,我們的序列已經有序了,并且我們執行的次數一共是是4次(n-1)。
針對上述的例子我們進行說明如下:
(1).選擇排序一共有數組大小-1(n-1)輪排序
(2).每一輪排序,又是一個循環,我們先假定每次循環的第一個數都是最小的數,然后和后面的每個數進行比較,如果發現有比當前更小的數,就重新確定這個最小的數,并且要得到這個數的下標。依次進行循環
上述過程在代碼中我會通過注釋說明。
下面的代碼中,我會將選擇排序通過兩種代碼實現:分步驟的實現,整體的實現。在代碼中,我們測試的數組是:[101,34,119,1]
(1).分步驟的實現選擇排序
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
selectSort(arr);
}
//選擇排序
public static void selectSort(int[] arr){
//第一趟排序
System.out.println("執行的第一趟排序:");
//首先我們要假設第一個元素是最小的,并且記錄最小元素的下標,這里我們分別用min,minIndex表示。
int min = arr[0];
int minIndex = 0;
for(int j = 1+0;j
if(min>arr[j]){ //當我們的min值大于后面的數時,說明min不是最小的,這時候,我們將min與最小的值交換,并且讓minIndex索引變成最小值的索引。
min = arr[j];
minIndex = j;
}
}
//通過上面的交換,我們可以得到這趟序列中最小的元素的值。
//因為我們的第一個元素是我們指定的最小元素,因此在找到比第一個元素更小的元素后,我們應該讓其與第一個元素交換。
arr[minIndex] = arr[0];
arr[0] = min;
System.out.println(Arrays.toString(arr));
//接下來的幾趟排序與第一趟相同
//第二趟排序
System.out.println("執行的第二趟排序:");
min = arr[1];
minIndex = 1;
for(int j = 1+1;j
if(min > arr[j]){
min = arr[j];
minIndex = j;
}
}
arr[minIndex] = arr[1];
arr[1] = min;
System.out.println(Arrays.toString(arr));
//第三趟排序
System.out.println("執行的第三趟排序:");
min = arr[2];
minIndex = 2;
for(int j = 1+2;j
if(min > arr[j]){
min = arr[j];
minIndex = j;
}
}
arr[minIndex] = arr[2];
arr[2] = min;
System.out.println(Arrays.toString(arr));
}
上述代碼我們得到的最終結果是:
(2).整體的代碼實現
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
selectSort(arr);
}
//選擇排序
public static void selectSort(int[] arr){
//選擇排序的算法
//通過上面的分步,我們可以知道,可以通過循環嵌套來實現
for(int i=0;i
int min = arr[i];
int minIndex = i;
for(int j=i+1;j
if(min>arr[j]){
min = arr[j];
minIndex = j;
}
}
arr[minIndex] = arr[i];
arr[i] = min;
System.out.println("第"+(i+1)+"趟排序的結果:");
System.out.println(Arrays.toString(arr));
}
}
上述代碼我們得到最終的結果是:
但是,還有一點值得注意的是,觀察我們第二趟的結果,我們發現與第一趟的結果是相同的,也就是說,我們在進行選擇排序的過程中,可能出現第一個數就是最小的數,這樣的話我們可以不需要執行交換的代碼,因此選擇排序的算法我們可以做進一步的優化,優化代碼如下(注釋里面有解釋):
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
selectSort(arr);
}
//選擇排序
public static void selectSort(int[] arr){
//選擇排序的算法
//通過上面的分步,我們可以知道,可以通過循環嵌套來實現
for(int i=0;i
int min = arr[i];
int minIndex = i;
for(int j=i+1;j
if(min>arr[j]){
min = arr[j];
minIndex = j;
}
}
if(minIndex != i){ //我們通過比較minIndex與i的值來確定是否 最小值發生了改變,如果沒有改變,我們不需要執行下面的代碼。
arr[minIndex] = arr[i];
arr[i] = min;
System.out.println("第"+(i+1)+"趟排序的結果:");
System.out.println(Arrays.toString(arr));
}
}
}
最終得到的結果如下:
總結
以上是生活随笔為你收集整理的数据结构 排序 java_Java数据结构之排序---选择排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 句柄和指针的区别
- 下一篇: VC编写的程序不能在其他机器上运行的解决