算法入门学习
排序算法
选择排序
package xyz.base01;
import java.util.Arrays;
public class Code01_SelectionSort {
public static int[] selectSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr, i, minIndex);
}
return arr;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int testTimes = 1000000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
long start = System.currentTimeMillis();
for (int i = 0; i < testTimes; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
selectSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
break;
}
}
long end = System.currentTimeMillis();
System.out.println("一共执行了 :" + (end - start) / 1000 + "秒钟");
System.out.println(succeed ? "YES!!!" : "Occured a mistake");
}
private static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
private static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static void comparator(int[] arr) {
Arrays.sort(arr);
}
private static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
private static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random() - (maxValue + 1) * Math.random());
}
return arr;
}
}
冒泡排序
package xyz.base01;
import java.util.Arrays;
public class Code02_BubbleSort {
public static void bubblerSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int e = arr.length - 1; e > 0; e--) {
for (int i = 0; i < e; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
}
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int testTimes = 1000000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
long start = System.currentTimeMillis();
for (int i = 0; i < testTimes; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
bubblerSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
break;
}
}
long end = System.currentTimeMillis();
System.out.println("一共执行了 :" + (end - start) / 1000 + "秒钟");
System.out.println(succeed ? "YES!!!" : "Occured a mistake");
}
private static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
private static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static void comparator(int[] arr) {
Arrays.sort(arr);
}
private static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
private static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random() - (maxValue + 1) * Math.random());
}
return arr;
}
}
插入排序
package xyz.base01;
import java.util.Arrays;
public class Code03_InsertionSort {
public static void insertSort(int[] arr) {
int n = arr.length;
if (arr == null || n < 2) {
return;
}
for (int i = 0; i < n; i++) {
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j - 1]) {
swap(arr, j, j - 1);
} else {
break;
}
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int testTimes = 1000000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
long start = System.currentTimeMillis();
for (int i = 0; i < testTimes; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
insertSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
break;
}
}
long end = System.currentTimeMillis();
System.out.println("一共执行了 :" + (end - start) / 1000 + "秒钟");
System.out.println(succeed ? "YES!!!" : "Occured a mistake");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr);
insertSort(arr);
printArray(arr);
}
private static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
private static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static void comparator(int[] arr) {
Arrays.sort(arr);
}
private static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
private static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random() - (maxValue + 1) * Math.random());
}
return arr;
}
}
希尔排序
package xyz.standalon.sort;
import java.util.Arrays;
public class Code01_ShellSort {
public static void shellSort(int[] arr) {
int N = arr.length;
if (arr == null || N < 2) {
return;
}
int step = N / 2;
int left = 0;
int right = N - 1;
while (step > 0) {
for (int i = step; i <= right; i++) {
for (int j = i; j >= step; j -= step) {
if (arr[j] < arr[j - step]) {
swap(arr, j, j - step);
} else {
break;
}
}
}
step = step / 2;
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int testTimes = 2000000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
long start = System.currentTimeMillis();
for (int i = 0; i < testTimes; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
shellSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
break;
}
}
long end = System.currentTimeMillis();
System.out.println("一共执行了 :" + (end - start) / 1000 + "秒钟");
System.out.println(succeed ? "YES!!!" : "Occured a mistake");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr);
shellSort(arr);
printArray(arr);
}
private static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
private static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static void comparator(int[] arr) {
Arrays.sort(arr);
}
private static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
private static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random() - (maxValue + 1) * Math.random());
}
return arr;
}
}
归并排序
package xyz.standalon.sort;
import java.util.Arrays;
public class Code02_MergeSort {
public static void mergeSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
if (arr[mid] > arr[mid + 1]) {
merge(arr, left, mid, right);
}
}
private static void merge(int[] arr, int l, int mid, int r) {
int[] aux = Arrays.copyOfRange(arr, l, r + 1);
int i = l;
int j = mid + 1;
for (int k = l; k <= r; k++) {
if (l > mid) {
arr[k] = aux[j - l];
} else if (j > r) {
arr[k] = aux[i - l];
} else if (arr[i - l] < arr[j - l]) {
arr[k] = arr[i - l];
i++;
} else {
arr[k] = arr[j - l];
j++;
}
}
}
public static int[] mergeSortInBaidu(int[] nums, int l, int h) {
if (l == h)
return new int[]{nums[l]};
int mid = l + (h - l) / 2;
int[] leftArr = mergeSortInBaidu(nums, l, mid);
int[] rightArr = mergeSortInBaidu(nums, mid + 1, h);
int[] newNum = new int[leftArr.length + rightArr.length];
int m = 0, i = 0, j = 0;
while (i < leftArr.length && j < rightArr.length) {
newNum[m++] = leftArr[i] <= rightArr[j] ? leftArr[i++] : rightArr[j++];
}
while (i < leftArr.length)
newNum[m++] = leftArr[i++];
while (j < rightArr.length)
newNum[m++] = rightArr[j++];
return newNum;
}
public static void main(String[] args) {
int testTimes = 10;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
long start = System.currentTimeMillis();
for (int i = 0; i < testTimes; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
mergeSortInBaidu(arr1, 0, arr1.length - 1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
break;
}
}
long end = System.currentTimeMillis();
System.out.println("一共执行了 :" + (end - start) / 1000 + "秒钟");
System.out.println(succeed ? "YES!!!" : "Occured a mistake");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr);
mergeSort(arr, 0, arr.length - 1);
printArray(arr);
}
private static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
private static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static void comparator(int[] arr) {
Arrays.sort(arr);
}
private static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
private static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random() - (maxValue + 1) * Math.random());
}
return arr;
}
}
随机化快速排序
双路快速排序
三路排序算法