冒泡

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

选择

  1. public static void selectionSort(int arr[], int length) {
  2. int index, temp;
  3. for (int i = 0; i < length; i++) {
  4. index = i;
  5. for (int j = i + 1; j < length; j++) {
  6. if (arr[j] < arr[index]) {
  7. index = j;
  8. }
  9. }
  10. if (index != i) {
  11. temp = arr[i];
  12. arr[i] = arr[index];
  13. arr[index] = temp;
  14. }
  15. }
  16. }

插入排序

  1. void InsertSort(int arr[], int length) {
  2. for (int i = 1; i < length; i++) {
  3. int j;
  4. if (arr[i] < arr[i - 1]) {
  5. int temp = arr[i];
  6. for (j = i - 1; j >= 0 && temp < arr[j]; j--) {
  7. arr[j + 1] = arr[j];
  8. }
  9. arr[j + 1] = temp;
  10. }
  11. }
  12. }

快速排序

  1. // 快速排序
  2. void QuickSort(int arr[], int start, int end) {
  3. if (start >= end) {
  4. return;
  5. }
  6. int i = start;
  7. int j = end;
  8. // 基准数
  9. int baseval = arr[start];
  10. while (i < j) {
  11. // 从右向左找比基准数小的数
  12. while (i < j && arr[j] >= baseval) {
  13. j--;
  14. }
  15. if (i < j) {
  16. arr[i] = arr[j];
  17. i++;
  18. }
  19. // 从左向右找比基准数大的数
  20. while (i < j && arr[i] < baseval) {
  21. i++;
  22. }
  23. if (i < j) {
  24. arr[j] = arr[i];
  25. j--;
  26. }
  27. }
  28. // 把基准数放到i的位置
  29. arr[i] = baseval;
  30. // 递归
  31. QuickSort(arr, start, i - 1);
  32. QuickSort(arr, i + 1, end);
  33. }


归并排序

  1. /**
  2. * 归并排序
  3. *
  4. * @param array
  5. */
  6. public static void MergeSort(int[] array) {
  7. int left = 0;
  8. int right = array.length - 1;
  9. MergeSortRecursive(array, left, right);
  10. }
  11. /**
  12. * 归并排序的递归方法
  13. *
  14. * @param array
  15. * @param left
  16. * @param right
  17. */
  18. public static void MergeSortRecursive(int[] array, int left, int right) {
  19. if (left >= right) {
  20. return; //递归的停止判断,没有这个判断会报StackOverflowError
  21. }
  22. int mid = (left + right) / 2;
  23. MergeSortRecursive(array, left, mid);
  24. MergeSortRecursive(array, mid + 1, right);
  25. Merge(array, left, mid, right);
  26. }
  27. /**
  28. * 归并排序中合并方法
  29. *
  30. * @param array
  31. * @param left
  32. * @param mid
  33. * @param right
  34. */
  35. public static void Merge(int[] array, int left, int mid, int right) {
  36. int r_left = mid + 1; //需要合并数组中右边数组第一个数索引
  37. int[] tempArray = new int[array.length];//一个临时数组,用于合并时暂时存储
  38. int newIndex = left; //临时数组索引
  39. int tempLeft = left; //合并完了以后,用于复制数组的索引
  40. while (left <= mid && r_left <= right) { //将部分的数放入到临时数组中
  41. if (array[left] < array[r_left]) {
  42. tempArray[newIndex++] = array[left++];
  43. } else {
  44. tempArray[newIndex++] = array[r_left++];
  45. }
  46. }
  47. while (left <= mid) {
  48. tempArray[newIndex++] = array[left++]; //将左边还剩余的数放入临时数组(若需要合并的左边还剩余数)
  49. }
  50. while (r_left <= right) {
  51. tempArray[newIndex++] = array[r_left++];//将右边还剩余的数放入临时数组(若需要和并的右边还剩余数)
  52. }
  53. while (tempLeft <= right) {
  54. array[tempLeft] = tempArray[tempLeft++]; //将临时数组复制到array
  55. }
  56. }

希尔排序

  1. void ShellSort(int arr[], int length) {
  2. int increasement = length;
  3. int i, j, k;
  4. do {
  5. // 确定分组的增量
  6. increasement = increasement / 3 + 1;
  7. for (i = 0; i < increasement; i++) {
  8. for (j = i + increasement; j < length; j += increasement) {
  9. if (arr[j] < arr[j - increasement]) {
  10. int temp = arr[j];
  11. for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement) {
  12. arr[k + increasement] = arr[k];
  13. }
  14. arr[k + increasement] = temp;
  15. }
  16. }
  17. }
  18. } while (increasement > 1);
  19. }