1. 程式人生 > >Java排序法(氣泡排序、選擇排序、快速排序)

Java排序法(氣泡排序、選擇排序、快速排序)

 * 排序法
 */
public class Java_SortMethod {
static int temp;
public static void main(String[]args) {
int [] arr1 = new int[] {4,8,7,-6,5,0,2,3,9,1,-8,-9};
int [] arr2 = new int[] {4,8,7,-6,5,0,2,3,9,1,-8,-9};
int [] arr3 = new int[] {4,8,7,-6,5,0,2,3,9,1,-8,-9};


//排序方法一:氣泡排序
int[] bulle = Bulle(arr1);
for (int i : bulle) {
System.out.print(i+" ");
}
System.out.println();


//排序方法二:選擇排序
int[] chose = Chose(arr2);
for(int i : chose) {
System.out.print(i+" ");
}
System.out.println();


//排序方法三:快速排序
int start = 0;
int end = arr3.length-1;
int[] fast = Fast(arr3,start,end);
for (int i : fast) {
System.out.print(i+" ");
}
System.out.println();
}


//Bulle Sort (氣泡排序) 原理:相鄰兩數進行兩兩比較,若果後一位數大於前一位數,交換位置,否則位置不變
private static int[] Bulle(int[] arr) {
//外層控制排序的輪數
for(int i = 0 ; i < arr.length-1;i++) {
//內層控制需要排序的數
for(int j = 0 ; j < arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}


//Chose Sort(選擇排序) 原理:依次從每輪資料中找出最小值放在靠前的位置
private static int[] Chose(int[] arr) {
//選擇排序的優化
for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
int k = i;//此處如果第一位值為最小值,下面迴圈以及替換無效
for(int j = k + 1; j < arr.length; j++){// 選最小的記錄
if(arr[j] < arr[k]){ 
k = j; //記下目前找到的最小值所在的位置
}
}
//在內層迴圈結束,也就是找到本輪迴圈小於下標為i的數以後,再進行交換
if(i != k){  //交換a[i]和a[k]位置
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}    
}


return arr;
}


//Fast Sort(快速排序) 原理:每次將第一個值作為預設的中間值,將陣列拆分為三個子陣列,小於中間值的為第//一個子陣列,中間值為第二個子陣列,大於中間值的為第三個子陣列,以此為順序遞迴進行排序,快速排序//是所有排序中,效率較高的排序法
private static int[] Fast(int[]arr,int start,int end) {
//迴圈的條件
if(start<end) {
//將第一個值作為預設的中間值
int i = start; int j = end; int temp = arr[start];
while(i<j) {
//此處作用為filter,篩選出來的值就是大於等於中間值的
while(i < j && arr[j] >= temp) {
j--;
}
if(i<j) {//此處的作用就是替換,將大於等於temp的值,替換到temp後一位,依次類推
arr[i++]=arr[j];
}
//此處作用也是為filter,篩選出來的值就是小於中間值的

while(i < j && arr[i]<temp) {
i++;
}
if(i < j) {
arr[j--]=arr[i];
}
}