Java 排序 快速排序 氣泡排序 選擇排序 插入排序
阿新 • • 發佈:2019-02-20
在平常寫程式碼的過程中我們經常會遇到排序的情況,下面我就寫了幾種常見的排序演算法,雖然在真正的專案開發中。很少會用到自己寫的排序演算法。但是隻有懂得了排序演算法具體是怎麼實現的,這樣用起來就會更加的得心應手。我只寫了幾種演算法。下面貼上自己寫的程式碼。程式碼裡面有演算法的思路,希望能夠有點用。
package sort;
/**
* @author 曾煒龍 E-mail: [email protected]
* @date 建立時間:2017年8月9日 上午10:22:11
* @version 1.0
* @parameter 排序演算法
* @since
* @return
*/
public class SortDemo {
/**
* 氣泡排序
* 比較相鄰的元素,如果第一個比第二個大,就交換他們兩個
* 對麼一堆相鄰元素做同樣的工作,從開始第一對到結尾最後一對。在這一點,最後的元素應該會是最大的數
* 針對所有的元素重複以上的步驟,除了最後一個,
* 持續每次對越來越少的元素重複上面的步驟,知道沒有任何一對數字需要比較
* @param numbers 整型陣列
*/
public static void bubbleSort(int[] numbers){
int size = numbers.length;
int temp = 0;
for(int i = 0;i<size-1;i++){
for(int j = 0;j<size-1-i;j++){
if(numbers[j]>numbers[j+1]){
temp = numbers[j];
numbers[j] = numbers[j+1];
numbers[j+1] = temp;
}
}
}
}
/**
* 快速排序
* 快速排序利用分治法,先取中值,然後利用中值對兩邊分別進行排序,然後遞迴呼叫函式。最後將陣列組合在一起,就是排好序的
*
*/
public static void quickSort(int[] numbers,int low,int hign){
if(low<hign){
int middle = getMiddle(numbers,low,hign);
quickSort(numbers,low,middle-1); //對低的一方進行遞迴排序
quickSort(numbers,middle+1,hign); //對高的一方進行遞迴排序
}
}
public static int getMiddle(int[] numbers,int low,int hign){
int temp = numbers[low]; //陣列的第一個元素為中值
while(low<hign){
while(low<hign && numbers[hign]>temp){
hign--;
}
numbers[low] = numbers[hign];
while(low<hign && numbers[low]<temp){
low++;
}
numbers[hign] = numbers[low];
}
numbers[low] = temp;
return low;
}
/**
* 快速排序方法呼叫
*
*/
public static void quick(int[] numbers){
if(numbers.length>0){
quickSort(numbers,0,numbers.length-1);
}
}
/**
* 選擇排序
* 在未排序序列中找到最小元素,存放到排序序列的起始位置
* 再從剩餘的元素中找到最小元素存放到 排序序列起始位置
* 以此類推,直到最後一個數排序完成
*/
public static void selectSort(int[] numbers){
int size = numbers.length;
int temp = 0; //中間變數
for(int i=0;i<size;i++){
int k = i;
for(int j=size-1;j>i;j--){
if(numbers[j]<numbers[k]){
k= j;
}
}
temp = numbers[i];
numbers[i] = numbers[k];
numbers[k] = temp;
}
}
/**
* 插入排序
* 取出第一個值,在排序序列元素中從後向前掃描
* 如果該元素大於新元素,則將該元素移到下一位置
* 重複步驟,直到找到已排序的元素小於或等於新元素的位置
*/
public static void insertSort(int[] numbers){
int size = numbers.length; //陣列長度
int temp = 0; //中間量
int j = 0;
for(int i=0;i<size;i++){
temp = numbers[i];
for(j=i;j>0&&temp<numbers[j-1];j-- ){
numbers[j] = numbers[j-1];
}
numbers[j] = temp;
}
}
}