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