快速排序(帶輸入)
package com.lei.sort;
import java.util.Scanner;
public class quick_sort {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String[] ss = null;
while (true) {
System.out.println("輸入數字,用空格隔開.輸入結束請換行輸入exit。");
System.out.println();
String temp = input.nextLine();
if (temp.trim().equals("exit")) {
break;
}
ss = temp.trim().split(" ");
}
int q = ss.length;
int[] a = new int[q];
for (int i = 0; i < q; i++) {
a[i] = Integer.parseInt(ss[i]);
}
System.out.println("輸入的數字是:");
System.out.println(Arrays.toString(a));
System.out.println();
System.out.println("輸入結束");
quickSort(a, a.length);
System.out.println("排序之後結果:");
System.out.println(Arrays.toString(a));
}
public static void quickSort(int[] A, int n) {
// write code here
if (A == null || A.length < 2) {
return A;
}
sort(A, 0, A.length - 1);
}
public static void sort(int a[], int left, int right) {
if (left < right) {
int index = find(a, left, right);
sort(a, left, index - 1);
sort(a, index + 1, right);
}
}
public static int find(int a[], int left, int right) {
int i = left;
int j = right;
int q = a[left];
while (i < j) {
while (i < j && q <= a[j]) {
j--;
}
if (i < j) {
a[i++] = a[j];
}
while (i < j && q >= a[i]) {
i++;
}
if (i < j) {
a[j--] = a[i];
}
}
a[i] = q;
return i;
}
}
堆排序
<span style="font-size:14px;">package com.lei.sort;
//不穩定
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int[] a={49,38,65,97,76,13,27,49,78,34,12,64};
int arrayLength=a.length;
//循環建堆
for(int i=0;i<arrayLength-1;i++){
//建堆
buildMaxHeap(a,arrayLength-1-i);
//交換堆頂和最後一個元素
swap(a,0,arrayLength-1-i);
System.out.println(Arrays.toString(a));
}
}
//對data數組從0到lastIndex建大頂堆
public static void buildMaxHeap(int[] data, int lastIndex){
//從lastIndex處節點(最後一個節點)的父節點開始
for(int i=(lastIndex-1)/2;i>=0;i--){
//k保存正在判斷的節點
int k=i;
//如果當前k節點的子節點存在
while(k*2+1<=lastIndex){
//k節點的左子節點的索引
int biggerIndex=2*k+1;
//如果biggerIndex小於lastIndex,即biggerIndex+1代表的k節點的右子節點存在
if(biggerIndex<lastIndex){
//若果右子節點的值較大
if(data[biggerIndex]<data[biggerIndex+1]){
//biggerIndex總是記錄較大子節點的索引
biggerIndex++;
}
}
//如果k節點的值小於其較大的子節點的值
if(data[k]<data[biggerIndex]){
//交換他們
swap(data,k,biggerIndex);
//將biggerIndex賦予k,開始while循環的下一次循環,重新保證k節點的值大於其左右子節點的值
k=biggerIndex;
}else{
break;
}
}
}
}
//交換
private static void swap(int[] data, int i, int j) {
int tmp=data[i];
data[i]=data[j];
data[j]=tmp;
}
}</span>
歸併排序
package com.lei.sort;
public class MergerSort {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] a = {54,35,48,36,27,12,44,44,8,14,26,17,28};
mergeSort(a, a.length);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
public static void mergeSort(int[] A, int n) {
fen(A, 0, n-1);
}
public static void fen(int [] a,int left,int right){
if (left>=right) {
return ;
}
int mod = (left+right)/2;
// 繼續劃分成 2份
fen(a, left, mod);
fen(a, mod+1, right);
//合併兩個
sort(a, left, right);
}
public static void sort (int [] A ,int left,int right){
int []temp = new int [right-left+1];
int tempmid = (left+right)/2;
int templeft= left;
int tempright= tempmid+1;
int i= 0;
while (templeft<=tempmid && tempright<=right) {
if (A[templeft]<A[tempright]) {
temp[i++] = A[templeft++];
}else {
temp[i++] = A[tempright++];
}
}
while (templeft<=tempmid) {
temp[i++]=A[templeft++];
}
while (tempright<=right) {
temp[i++]=A[tempright++];
}
int j=0;
while (j<=temp.length-1) {
A[left++]=temp[j++];
}
}
}