1.冒泡排序
package Sort;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int [] a = {1,100,234,44,3,2,4,5};
bubbleSort(a,a.length+1);
System.out.println(Arrays.toString(a));
}
public static int[] bubbleSort(int[] A, int n) {
for (int i=0;i<A.length;i++){
for (int j=i+1;j<A.length;j++){
if (A[i] > A[j]){
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
}
return A;
}
}
2.快速排序
package Sort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int A[] = {1,6,9, 2, 3, 1, 5, 4 };
quickSort(A, 0, 7);
System.out.println(Arrays.toString(A));
}
public static void quickSort(int[] A, int left, int right) {
if (left < right) {
// 一次划分
int mid = partion(A, left, right);
quickSort(A, 0, mid - 1);
quickSort(A, mid + 1, right);
}
}
public static void swap(int[] A, int l, int r) {
int tmp = A[l];
A[l] = A[r];
A[r] = tmp;
}
public static int partion(int[] a, int left, int right) {
// 軸值,默認選取數組的第一個數字
while (left < right) {
while (left < right && a[left] <= a[right]) {
right--;
}
if (left<right){
swap(a, left, right);
}
while (left < right && a[left] <= a[right]) {
left++;
}
if (left<right){
swap(a, left, right);
}
}
return left;
}
}
3.插入排序
package Sort;
public class InsertionSort { public int[] insertionSort(int[] A, int n) { int i, j, temp; for(i = 1; i < n; i++){ temp = A[i]; for(j = i; j > 0 && A[j - 1] > temp; j-- ){ A[j] = A[j - 1]; } A[j] = temp; } return A; } }
3.1希爾排序(插入排序的一種)
package Sort;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int[] a = { 54, 35, 48, 36, 27, 12, 44, 44, 8, 14, 26, 17, 28 };
sort(a);
System.out.println(Arrays.toString(a));
}
public static void sort(int[] a) {
// 設置步長,默認為數組長度的一半
int step = a.length / 2;
while (step >= 1) {
for (int i = step; i < a.length; i += step) {
int tmp = a[i];
int j;
for (j = i; j > 0 && a[j - step] > tmp; j -= step) {
a[j] = a[j - step];//元素后移
}
a[j] = tmp;//插入的位置,注意此時j在for循環中已經進行了一次--
}
step /= 2;
}
}
}
4.選擇排序
package Sort;
public class SelectionSort {
public int[] selectionSort(int[] A, int n) {
// write code here
for (int i = 0; i < n - 1; i++) {
int index = i;
int j;
// 找出最小值得元素下標
for (j = i + 1; j < n; j++) {
if (A[j] < A[index]) {
index = j;
}
}
int tmp = A[index];
A[index] = A[i];
A[i] = tmp;
}
return A;
}
}
5. 歸並排序
package Sort;
public class MergeSort {
public static void main(String[] args) {
int[] A = { 1, 4, 3, 2, 5 };
mergeSort(A, 5);
for (int i = 0; i < A.length; i++) {
System.out.println(A[i]);
}
}
public static int[] mergeSort(int[] A, int n) {
// write code here
sort(A, 0, n - 1);
return A;
}
public static void sort(int[] A, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
sort(A, left, mid);
sort(A, mid + 1, right);
merge(A, left, mid, right);
}
}
public static void merge(int[] A, int left, int mid, int right) {
// 臨時數組
int n = right - left + 1;
int[] tmpArr = new int[n];
int l = left;
int r = mid + 1;
int t = 0;// 臨時數組下標元素
// 比較兩子序列元素的大小
while (l <= mid && r <= right) {
if (A[l] < A[r]) {
tmpArr[t++] = A[l++];
} else {
tmpArr[t++] = A[r++];
}
}
// 剩余的加入臨時數組
while (l <= mid) {
tmpArr[t++] = A[l++];
}
// 剩余的加入臨時數組
while (r <= right) {
tmpArr[t++] = A[r++];
}
// 把臨時數組元素放回原數組
for (int i = 0; i < t; i++) {
A[left + i] = tmpArr[i];
}
}
}
6.堆排序
package Sort;
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int[] a = { 2, 5, 9, 6, 1, 4, 8, 7, 12, 50 };
sort(a);
System.out.println(Arrays.toString(a));
}
public static void sort(int[] a) {
int len = a.length;
for (int i = 0; i < len - 1; i++) {
// 建堆
buildHeap(a, len - 1 - i);
// 交換堆頂元素和最后一個元素
swap(a, 0, len - 1 - i);
}
}
private static void swap(int[] a, int i, int j) {
// TODO Auto-generated method stub
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
public static void buildHeap(int[] a, int lastIndex) {
// 從最后一個節點的父節點開始
for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
// 當前節點存在子節點
while (i * 2 + 1 <= lastIndex) {
// 左節點下標值
int l = i * 2 + 1;
// 右結點下標值
int r = i * 2 + 2;
// 默認左節點為最大值
int biggerIndex = l;
// 存在右結點
if (l < lastIndex) {
// 右結點的值比左節點大
if (a[r] > a[l]) {
biggerIndex = r;
}
}
// 當前節點的值比孩子節點的最小值小,交換
if (a[i] < a[biggerIndex]) {
swap(a, i, biggerIndex);
// 把最大值下標賦給當前節點,進入下一次while循環判斷
i = biggerIndex;
} else {
break;
}
}
}
}
}
7.計數排序
8.基數排序
9.桶排序