冒泡排序
public void bubbleSort(int[] arr) { for (int i = arr.length-1; i > 0; i--) { boolean isSort = true; for (int j = 0; j < i; j++) { if(arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; isSort = false; } } if (isSort) { break; } } } |
快速排序
public void recQuickSort(int[] arr, int left, int right) { if(left >= right) { // 递归停止条件 return; } else { // 先获取枢纽, _______ □ ________, 方块是枢纽,目的是让左边的比方块小,右边的比方块大 int pivot = arr[right]; // 开始划分,把比枢纽小的放到左边,比枢纽大的放到右边 int partition = partition(arr, left, right, pivot); // 递归划分后的左边和右边 recQuickSort(arr, left, partition-1); recQuickSort(arr, partition+1, right); } }
public int partition(int[] arr, int left, int right, int pivot) { // 左边开始位置,减1是因为要使用++leftPtr int leftPtr = left - 1; // 右边同样使用--rightPtr,但是不用加1,是因为最右是枢纽,实际是从right-1开始的,因此right-1+1=right int rightPtr = right; // 开始划分 while (true) { // 找到左边比枢纽大的数 while (arr[++leftPtr] < pivot); // 找到右边比枢纽小的数 while (rightPtr > 0 && arr[--rightPtr] > pivot); // 循环终止条件 if (leftPtr >= rightPtr) { break; } else { // 否则交换位置 swap(arr, leftPtr, rightPtr); } } // 划分完后,将最右(枢纽放到方块位置) swap(arr, leftPtr, right); return leftPtr; }
public void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } |
二分查找(海量有序数据估计需要用这个)
public int find(int[]arr, int value) { int min = 0; int max = arr.length; while (true) { int mid = (min + max) / 2; if (min > max) { return -1; } else if (arr[mid] == value) { return mid; } else if (arr[mid] > value) { max = mid - 1; } else if (arr[mid] < value) { min = mid + 1; } } } |