Java排序程式碼
阿新 • • 發佈:2018-11-03
public class Sort { public static void main(String[] args) { int[] data={3,6,8,3,2,45,7,567,5,12,234,3465,75,543,2,25,3,4,57,8,78,33,7,43,86,444}; int[] outData = quickSort(data,0,data.length-1); showData(outData); } //氣泡排序 public static int[] bubbleSort(int[] data){ int temp; for (int i=0;i<data.length;i++){ for (int j=data.length-1;j>i;j--){ //注意j-- if (data[j]<data[j-1]){ //data[j]<data[j-1]的比較 temp=data[j-1]; data[j-1]=data[j]; data[j]=temp; } } } return data; } //選擇排序 public static int[] selectSort(int[] data){ int min,temp; for (int i=0;i<data.length;i++){ min=i; //min的初始化 for (int j=i+1;j<data.length;j++){ if (data[j]<data[min]){ min=j; } } if (min!=i){ temp=data[i]; data[i]=data[min]; data[min]=temp; } } return data; } //插入排序 public static int[] insertSort(int[] data){ int temp,j; for (int i=0;i<data.length-1;i++){ if (data[i]>data[i+1]){ temp=data[i+1]; for (j=i;j>=0 && data[j]>temp ;j--){ //j--的原因在於從後往前挪移資料 data[j+1]=data[j]; } data[j+1]=temp; //注意上一個for迴圈最後j--,所以j+1 } } return data; } //希爾排序 public static int[] shellSort(int[] data){ int temp; int jump=data.length/2; //jump作為一個階段 while (jump!=0){ for (int i=jump;i<data.length;i++){ //i從jump開始迴圈 if (data[i]<data[i-jump]){ //插入排序的變形 temp=data[i]; int j; for (j=i-jump;j>=0 && data[j]>temp;j-=jump){ data[j+jump]=data[j]; } data[j+jump]=temp; } } jump=jump/2; } return data; } //堆排序1 public static int[] headSort(int[] data){ //此迴圈的目的是將非葉節點排序成完整的大頂堆 for (int i=data.length/2-1;i>=0;i--){ //for迴圈從data.length/2-1到0 headAdjust(data,i,data.length-1); } //次迴圈的目的是將data[0]與data[i]交換保證data[i]是最大的 for (int i=data.length-1;i>0;i--){ int temp=data[0]; //將data[0]與data[i]交換 data[0]=data[i]; data[i]=temp; headAdjust(data,0,i-1); //排序從0到i-1的資料 } return data; } //堆排序2 public static void headAdjust(int[] data,int start,int end){ int temp=data[start]; for (int i=2*start+1;i<=end;i=2*i+1){ if (i+1<=end && data[i]<data[i+1]){ i++; } if (data[i]<=temp){ break; } data[start]=data[i]; start=i; } data[start]=temp; } //快速排序1 public static int[] quickSort(int[] data,int low,int high){ if (low<high){ int partition = quickSortPartition(data,low,high); //獲取樞紐值 quickSort(data,low,partition-1); //遞迴至low>=high quickSort(data,partition+1,high); } return data; } //快速排序2 public static int quickSortPartition(int[] data,int low,int high){ int pivot=data[low]; //將data[low]作為預設的樞紐記錄 while (low<high){ while (low<high && data[high]>=pivot) //注意此節點是while迴圈, high--; //在data[high]>=pivot時是正確的排序,所以移動high的值 int[] data1 = swap(data, low, high); while (low<high && data[low]<=pivot) low++; int[] data2 = swap(data1, low, high); } return low; } //交換num1和num2的資料 public static int[] swap(int[] data,int num1,int num2){ int temp=data[num1]; data[num1]=data[num2]; data[num2]=temp; return data; } //列印資料 public static void showData(int[] data){ System.out.print("[ "); for(int i:data){ System.out.print(i); System.out.print(" "); } System.out.print("]"); } }