package com.hpe.test;
import java.util.Arrays;
public class Sort {
public static void main(String[] args) {
int arr[] = {3,5,2,6,1,4};
// 選擇排序
//selectSort(arr);
//System.out.println("選擇排序結果:"+Arrays.toString(arr));
// 插入排序
//insertSort(arr);
//System.out.println("插入排序結果:"+Arrays.toString(arr));
// 歸併排序
//mergeSort(arr, 0, arr.length-1);
//System.out.println("歸併排序結果:"+Arrays.toString(arr));
// 希爾排序
//shell(arr);
//System.out.println("希爾排序結果:"+Arrays.toString(arr));
// 快速排序
quicksort(arr,0,arr.length-1);
System.out.println("快速排序結果:"+Arrays.toString(arr));
}
// 快速排序
private static void quicksort(int[] a, int left, int right) {
if(left > right){
return;
}
int i = left;
int j = right;
int x = a[i];
while(i < j){
while(a[j] >= x && i < j){
--j;
}
if(i < j){
a[i] = a[j];
}
while(a[i] < x && i < j){
++i;
}
if(i < j){
a[j] = a[i];
}
}
// 基準點到最終位置上
a[i] = x;
// 對左右進行遞歸排序
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}
// 希爾排序
public static void shell(int []a){
// n表示數組長度
int n = a.length;
for(int i = n/2;i >= 1;i = i/2){// 步長的變化
for(int j = 0;j+i < n;++j){
// 內部進行插入排序
if(a[j+i] < a[j]){
int x = a[j+i];
int k = j + i;
for(;k-i >= 0;k = k-i){
if(a[k] < a[k-i]){
a[k] = a[k-i];
}else{
a[k] = x;
break;
}
}
if(k-i < 0){
a[k] = x;
}
}
}
}
}
// 歸併排序
public static void mergeSort(int []a,int left,int right){
// 一定要寫此處的遞歸結束條件!!!!!!!!
if(left < right){
int mid = (left + right) / 2;
mergeSort(a, 0, mid);
mergeSort(a, mid+1, right);
merge(a, left, right);
}
}
// 歸併合併
public static void merge(int []a,int left,int right){
int i = left;
int mid = (left + right)/2;
int j = mid + 1;
int k = 0;
int n = right - left +1;
int []b = new int[n];
while(i <= mid && j <= right){
if(a[i] <= a[j]){
b[k++] = a[i++];
}else{
b[k++] = a[j++];
}
}
while(i <= mid){
b[k++] = a[i++];
}
while(j <= right){
b[k++] = a[j++];
}
i = left;
for(j = 0;j < n;++j){
a[i+j] = b[j];
}
}
// 插入排序
public static void insertSort(int []a){
if(a.length <= 1){
return;
}
for(int i = 1;i <= a.length-1;++i){
if(a[i] < a[i-1]){
// 保存元素
int x = a[i];
// 尋找插入位置
for(int j = i-1;j >= 0;--j){
if(x < a[j]){
a[j+1] = a[j];
}else{
a[j+1] = x;
break;
}
if(j == 0){
a[0] = x;
}
}
}
}
}
// 選擇排序
public static void selectSort(int []a){
if(a.length <= 1){
return;
}
for(int i = 0;i < a.length;++i){
// 找最小
int min = i;
for(int j = i+1;j < a.length;++j){
if(a[j] < a[min]){
min = j;
}
}
// 交換
if(min != i){
int t = a[i];
a[i] = a[min];
a[min] = t;
}
}
}
}
幾種基本的排序算法實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.