又回到最初的起点~

swap方法

使用异或来进行数组中两个位置上值的交换。

  1. private void swap(int[] array, int i, int j) {
  2. if (i == j || array[i] == array[j]) {
  3. return;
  4. }
  5. array[j] = array[i] ^ array[j];
  6. array[i] = array[i] ^ array[j];
  7. array[j] = array[i] ^ array[j];
  8. }

冒泡

  1. public void bubbleSort(int[] array) {
  2. for (int i = array.length - 1; i > 0; i--) {
  3. for (int j = 0; j < i; j++) {
  4. if (array[j] > array[j + 1]) {
  5. swap(array, j, j + 1);
  6. }
  7. }
  8. }
  9. }

选择

每次遍历选出一个最大的,与最后一个进行交换,下次遍历不包含最后一个。

  1. public void selectSort(int[] array) {
  2. for (int i = array.length - 1; i > 0; i--) {
  3. int maxIndex = 0;
  4. for (int j = 1; j <= i; j++) {
  5. if (array[maxIndex] < array[j]) {
  6. maxIndex = j;
  7. }
  8. }
  9. swap(array, maxIndex, i);
  10. }
  11. }

插入

从 0 到 i (不包括 i )的元素已经排好序,i 到 array.length-1 为未排序。将i与之前的元素进行比较,找到自己的位置并插入。

  1. public void insertSort(int[] array) {
  2. for (int i = 1; i < array.length; i++) {
  3. for (int j = i; j > 0; j--) {
  4. if (array[j] < array[j - 1]) {
  5. swap(array, j, j - 1);
  6. } else {
  7. break;
  8. }
  9. }
  10. }
  11. }

归并

  1. public void mergeSort(int[] array) {
  2. if (array.length == 1) {
  3. return;
  4. }
  5. mergeProcess(array, 0, array.length - 1);
  6. }
  7. private void mergeProcess(int[] array, int l, int r) {
  8. if (l == r) {
  9. return;
  10. }
  11. int[] temp = new int[array.length];
  12. int mid = l + ((r - l) >> 1);
  13. mergeProcess(array, l, mid);
  14. mergeProcess(array, mid + 1, r);
  15. int p1 = l;
  16. int p2 = mid + 1;
  17. int index = l;
  18. while (p1 <= mid && p2 <= r) {
  19. temp[index++] = array[p1] > array[p2] ? array[p2++] : array[p1++];
  20. }
  21. while (p1 <= mid) {
  22. temp[index++] = array[p1++];
  23. }
  24. while (p2 <= r) {
  25. temp[index++] = array[p2++];
  26. }
  27. for (int i = l; i <= r; i++) {
  28. array[i] = temp[i];
  29. }
  30. }

堆排

  1. public void heapSort(int[] array) {
  2. for (int i = 0; i < array.length; i++) {
  3. heapInsert(array, i);
  4. }
  5. int size = array.length;
  6. swap(array, 0, --size);
  7. while (size > 0) {
  8. heapify(array, 0, size);
  9. swap(array, 0, --size);
  10. }
  11. }
  12. private void heapInsert(int[] array, int index) {
  13. //(index-1)/2 -> 父节点的index
  14. while (array[index] > array[(index - 1) / 2]) {
  15. swap(array, index, (index - 1) / 2);
  16. index = (index - 1) / 2;
  17. }
  18. }
  19. private void heapify(int[] array, int index, int size) {
  20. int left = index << 1 + 1;
  21. while (left < size) {
  22. int largest = left + 1 < size && array[left] < array[left + 1] ? left + 1 : left;
  23. largest = array[index] > array[largest] ? index : largest;
  24. if (largest == index) {
  25. return;
  26. }
  27. swap(array, largest, index);
  28. index = largest;
  29. left = index << 1 + 1;
  30. }
  31. }

快排

  1. public void quickSort(int[] array) {
  2. if (array.length <= 1) {
  3. return;
  4. }
  5. quickSort(array, 0, array.length - 1);
  6. }
  7. public void quickSort(int[] array, int left, int right) {
  8. if (left < right) {
  9. int radom = (int) (Math.random() * (right - left + 1));
  10. swap(array, left + radom, right);
  11. int[] result = partition(array, left, right);
  12. quickSort(array, 0, result[0] - 1);
  13. quickSort(array, result[1] + 1, right);
  14. }
  15. }
  16. public int[] partition(int[] array, int left, int right) {
  17. int midValue = array[right];
  18. //左部分右边界初始值
  19. int less = left - 1;
  20. //右部分左边界初始值
  21. int more = right;
  22. while (left < more) {
  23. if (array[left] < midValue) {
  24. swap(array, ++less, left++);
  25. } else if (array[left] > midValue) {
  26. swap(array, --more, left);
  27. } else {
  28. left++;
  29. }
  30. }
  31. swap(array, more, right);
  32. //返回的是中间区域的左右边界。
  33. return new int[]{less + 1, more};
  34. }