
package sort;
import java.util.ArrayList;
import java.util.Arrays;
public class Sort {
public static void main(String[] args) {
int[] arr = new int[20];
int index = 0;
for (int i = 20; i > 0; i--)
arr[index++] = i;
System.out.println("原数组:");
System.out.println(Arrays.toString(arr));
System.out.println("开始排序");
arr = BubbleSort(arr);
System.out.println("BubbleSort排序后为:");
System.out.println(Arrays.toString(arr));
}
public static int[] swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
public static int[] InsertionSort(int[] arr) {
if (arr.length == 0 || arr.length == 1)
return arr;
for (int i = 0; i < arr.length - 1; i++) {
int current = arr[i + 1];
int pre = i;
while (pre >= 0 && current < arr[pre]) {
arr[pre + 1] = arr[pre];
pre--;
}
arr[pre + 1] = current;
System.out.println(Arrays.toString(arr));
}
return arr;
}
public static int[] ShellSort(int[] arr) {
if (arr.length == 0 || arr.length == 1)
return arr;
int current, gap = arr.length / 2;
while (gap > 0) {
for (int i = gap; i < arr.length; i++) {
current = arr[i];
int pre = i - gap;
while (pre >= 0 && arr[pre] > current) {
arr[pre + gap] = arr[pre];
pre -= gap;
}
arr[pre + gap] = current;
System.out.println(Arrays.toString(arr));
}
gap /= 2;
}
return arr;
}
public static int[] SelectionSort(int[] arr) {
if (arr.length == 0 || arr.length == 1)
return arr;
for (int i = 0; i < arr.length - 1; i++) {
int MinIndex = i;
for (int j = i; j < arr.length; j++) {
if (arr[j] < arr[MinIndex])
MinIndex = j;
}
arr = swap(arr, MinIndex, i);
System.out.println(Arrays.toString(arr));
}
return arr;
}
public static int[] HeapSort(int[] arr) {
if (arr.length == 0 || arr.length == 1)
return arr;
int len = arr.length;
arr = AdjustMaxHeap(arr, len - 1);
while (len > 0) {
arr = swap(arr, 0, len - 1);
System.out.println(Arrays.toString(arr));
len--;
arr = AdjustMaxHeap(arr, len - 1);
}
return arr;
}
public static int[] AdjustMaxHeap(int[] arr, int lastIndex) {
for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
arr = AdjustLocalHeap(arr, lastIndex, i);
}
return arr;
}
public static int[] AdjustLocalHeap(int[] arr, int lastIndex, int i) {
int maxIndex = i;
if (i * 2 + 1 <= lastIndex && arr[i] < arr[i * 2 + 1])
maxIndex = i * 2 + 1;
if (i * 2 + 2 <= lastIndex && arr[i] < arr[i * 2 + 2] && arr[i * 2 + 1] < arr[i * 2 + 2])
maxIndex = i * 2 + 2;
if (maxIndex != i) {
arr = swap(arr, maxIndex, i);
arr = AdjustLocalHeap(arr, lastIndex, maxIndex);
}
return arr;
}
public static int[] BubbleSort(int[] arr) {
if (arr.length == 0 || arr.length == 1)
return arr;
boolean isSorted = false;
for (int i = arr.length - 1; i > 0 && !isSorted; i--) {
isSorted = true;
for (int j = 1; j <= i; j++) {
if (arr[j] > arr[j - 1]) {
isSorted = false;
arr = swap(arr, j, j - 1);
}
}
System.out.println(Arrays.toString(arr));
}
return arr;
}
public static int[] QuickSort(int[] arr) {
if (arr.length == 0 || arr.length == 1)
return arr;
arr = LocalQuickSort(arr, 0, arr.length - 1);
return arr;
}
public static int[] LocalQuickSort(int[] arr, int start, int last) {
if (start >= last)
return arr;
int benchmark = arr[start];
int left = start;
int right = last;
while (left < right) {
while (arr[right] > benchmark && left < right)
right--;
if (arr[right] <= benchmark && left < right)
arr[left++] = arr[right];
while (arr[left] < benchmark && left < right)
left++;
if (arr[right] >= benchmark && left < right)
arr[right--] = arr[left];
}
arr[left] = benchmark;
System.out.println(Arrays.toString(arr));
arr = LocalQuickSort(arr, start, left - 1);
arr = LocalQuickSort(arr, left + 1, last);
return arr;
}
public static int[] MergeSort(int[] arr) {
if (arr.length == 0 || arr.length == 1)
return arr;
arr = Merge(arr, 0, arr.length - 1);
return arr;
}
public static int[] Merge(int[] arr, int start, int last) {
if (start < last) {
int mid = (start + last) / 2;
arr = Merge(arr, start, mid);
arr = Merge(arr, mid + 1, last);
arr = merge(arr, start, mid, last);
}
return arr;
}
public static int[] merge(int[] arr, int start, int mid, int last) {
int[] tempArr = new int[arr.length];
int p1 = start, p2 = mid + 1, p = start;
while (p1 <= mid && p2 <= last) {
if (arr[p1] <= arr[p2])
tempArr[p++] = arr[p1++];
else
tempArr[p++] = arr[p2++];
}
while (p1 <= mid)
tempArr[p++] = arr[p1++];
while (p2 <= last)
tempArr[p++] = arr[p2++];
for (int i = start; i <= last; i++)
arr[i] = tempArr[i];
System.out.println(Arrays.toString(arr));
return arr;
}
public static int[] RadixSort(int[] arr) {
if (arr.length == 0 || arr.length == 1)
return arr;
int max = arr[0];
for (int x : arr)
max = Math.max(x, max);
int maxDigit = 0;
while (max != 0) {
max /= 10;
maxDigit++;
}
int mod = 10;
int div = 1;
ArrayList<ArrayList<Integer>> bucket = new ArrayList<ArrayList<Integer>>();
for (int j = 0; j < 10; j++) {
bucket.add(new ArrayList<Integer>());
}
for (int i = 0; i < maxDigit; i++, mod *= 10, div *= 10) {
System.out.println(Arrays.toString(arr));
for (int j = 0; j < arr.length; j++) {
int num = (arr[j] % mod) / div;
bucket.get(num).add(arr[j]);
}
int index = 0;
for (int j = 0; j < 10; j++) {
if (bucket.get(j).size() != 0) {
for (int x : bucket.get(j))
arr[index++] = x;
bucket.get(j).clear();
}
}
}
return arr;
}
public static int[] CountingSort(int[] arr) {
if (arr.length == 0 || arr.length == 1)
return arr;
int min, max;
min = max = arr[0];
for (int x : arr) {
if (x > max)
max = x;
if (x < min)
min = x;
}
int[] bucket = new int[max - min + 1];
Arrays.fill(bucket, 0);
for (int x : arr) {
bucket[x - min]++;
}
int index = 0;
for (int i = 0; i < bucket.length; i++) {
while (bucket[i] != 0) {
arr[index++] = i + min;
bucket[i]--;
}
}
return arr;
}
public static int[] BucketSort(int[] arr) {
if (arr.length == 0 || arr.length == 1)
return arr;
arr = Bucket(arr, 5);
return arr;
}
public static int[] Bucket(int[] arr, int bucketSize) {
int min, max;
min = max = arr[0];
for (int x : arr) {
if (x > max)
max = x;
if (x > min)
min = x;
}
int bucketCount = (max - min) / bucketSize + 1;
ArrayList<ArrayList<Integer>> bucket = new ArrayList<ArrayList<Integer>>();
for (int i = 0; i < bucketCount; i++)
bucket.add(new ArrayList<Integer>());
for (int x : arr) {
for (int bucketIndex = 0; bucketIndex < bucketCount; bucketIndex++) {
if (x >= min + bucketIndex * bucketSize && x < min + (bucketIndex + 1) * bucketSize) {
bucket.get(bucketIndex).add(x);
break;
}
}
}
int index = 0;
for (int i = 0; i < bucketCount; i++) {
bucket.set(i, InsertionSortOfArrayList(bucket.get(i)));
for (int x : bucket.get(i))
arr[index++] = x;
}
return arr;
}
public static ArrayList<Integer> InsertionSortOfArrayList(ArrayList<Integer> arr) {
if (arr.size() == 0 || arr.size() == 1)
return arr;
int current;
int pre;
for (int i = 0; i < arr.size() - 1; i++) {
pre = i;
current = arr.get(i + 1);
while (arr.get(pre) > current && pre >= 0) {
arr.set(pre + 1, arr.get(pre));
pre--;
}
arr.set(pre + 1, current);
}
return arr;
}
}