Java陣列-選擇排序-排序的效能問題
之前的選擇排序程式碼為:
class SelectionSort
{
public static void main(String[] args)
{
int[] arr = {14,19,11,109,56,3};
selectionSort(arr);
System.out.println("Hello World!");
for(int x=0;x<arr.length;x++)
{
System.out.print(arr[x]+",");
}
}
/*
選擇排序
*/
public static void selectionSort(int[] arr)
{
for(int x=0;x<arr.length-1;x++)
{
for (int y=x+1;y<arr.length ;y++ )
{
if(arr[x]>arr[y])
{
//把最小的數,排序到前面
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
for(int z=0;z<arr.length;z++)
{
System.out.print(arr[z]+",");
}
System.out.println();
}
}
}
從程式中可以看出選擇排序中是通過x迴圈1,y迴圈一遍,找出當前遍歷的這組數中的最小值,而每當y迴圈1,就將比較的兩個數中較小的放在前面,就是說,當x=0時,y迴圈一遍,僅僅將陣列中最小的數字替換到陣列的第一個元素裡;而當x=1時,則是從陣列的第二個元素開始遍歷,找出陣列剩餘元素的最小值,替換到第二個陣列元素處。但是每當y迴圈1時,比較的兩個數,後面的數小時,就會進行換位,這樣,換位的次數就會比較多,那麼可不可以找出遍歷的那部分陣列中的最小值之後再進行元素位置替換呢?顯然是可以的。
下面是對選擇排序部分的改進:
public static void selectionSort2(int[] arr)
{
for(int x=0;x<arr.length-1;x++)
{
int num = arr[x];
int index = x;
for(int y=x+1;y<arr.length;y++)
{
if(num>arr[y])
{
num=arr[y];
index = y;
}
}
if(index!=x)
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
選擇排序改進後的整個程式為:
/*
考慮到效能問題,對選擇排序法進行一定的改良
思路:找到陣列中的最小元素,將其和arr[0]換位,一次類推進行換位
換位次數相比之前的選擇排序法,效率明顯提高
實現: 一個變數記錄最小值,一個變數記錄最小值的索引
*/
class SelectionSort2
{
public static void main(String[] args)
{
System.out.println("Hello World!");
int[] arr={34,19,11,109,3,56};
selectionSort2(arr);
printArray(arr);
}
public static void selectionSort2(int[] arr)
{
for(int x=0;x<arr.length-1;x++)
{
int num = arr[x];
int index = x;
for(int y=x+1;y<arr.length;y++)
{
if(num>arr[y])
{
num=arr[y];
index = y;
}
}
if(index!=x)
swap(arr,x,index);
}
}
public static void swap(int[] arr,int x,int y)
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
public static void printArray(int[] arr)
{
for(int x=0;x<arr.length;x++)
{
if(x<arr.length-1)
System.out.print(arr[x]+",");
else
System.out.println(arr[x]);
}
}
}