1、冒泡排序

  1. /**
  2. 冒泡排序算法
  3. 冒泡排序算法的运作如下:(从后往前)
  4. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  5. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  6. 针对所有的元素重复以上的步骤,除了最后一个。
  7. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  8. 相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
  9. */
  10. import java.util.Scanner;
  11. public class Test12{
  12. public static void main(String[] args){
  13. int[] nums = {34,4,56,56,90,65};//待排序的数列
  14. //外循环控制轮数
  15. for(int i=0;i<nums.length-1;i++){ //比较轮数等于数列的长度-1
  16. for(int j=0;j<nums.length-1-i;j++){
  17. if(nums[j]>nums[j+1]){
  18. nums[j] = nums[j]+nums[j+1];
  19. nums[j+1] = nums[j]-nums[j+1];
  20. nums[j] = nums[j]-nums[j+1];
  21. }
  22. }
  23. }
  24. //输出结果
  25. for(int n : nums){
  26. System.out.println(n);
  27. }
  28. }
  29. }
  30. /*
  31. 34 4 56 17 90 65
  32. 4 34 17 56 65 90 //第一轮 5次
  33. 4 17 34 56 65 //第二轮 4次
  34. 4 17 34 56 //第三轮 3次
  35. 4 17 34 //第四轮 2次
  36. 4 17 //第五轮 1次
  37. */

2、选择排序

  1. /**
  2. 选择排序算法
  3. 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,
  4. 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
  5. 选择排序是不稳定的排序方法。
  6. */
  7. import java.util.Scanner;
  8. public class Test13{
  9. public static void main(String[] args){
  10. int[] nums = {34,4,56,17,90,65};//待排序的数列
  11. int minIndex = 0;//用于记录每次比较的最小值下标
  12. //控制轮数
  13. for(int i=0;i<nums.length-1;i++){
  14. minIndex = i;//每轮假设一个最小值下标
  15. for(int j=i+1;j<nums.length;j++){
  16. if(nums[minIndex]>nums[j]){
  17. minIndex = j;
  18. }
  19. }
  20. //判断需要交换的数下标是否为自己
  21. if(minIndex!=i){
  22. nums[minIndex] = nums[minIndex]+nums[i];
  23. nums[i] = nums[minIndex]-nums[i];
  24. nums[minIndex] = nums[minIndex]-nums[i];
  25. }
  26. }
  27. //输出结果:
  28. for(int n: nums){
  29. System.out.println(n);
  30. }
  31. }
  32. }
  33. /*
  34. 34 4 56 17 90 65
  35. 4 34 56 17 90 65 第一轮 5次
  36. 4 17 56 34 90 65 第二轮 4次
  37. 4 17 34 56 90 65 第三轮 3次
  38. 4 17 34 56 90 65 第四轮 2次
  39. 4 17 34 56 65 90 第五轮 1次
  40. */

3、插入排序

  1. /**
  2. 直接插入排序算法
  3. (从后向前找到合适位置后插入)
  4. 基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的子序列的合适位置(从后向前找到
  5. 合适位置后),直到全部插入排序完为止。
  6. */
  7. import java.util.Scanner;
  8. public class Test14{
  9. public static void main(String[] args){
  10. int[] nums = {34,4,56,17,90,65};//待排序的数列
  11. //控制比较的轮数:
  12. for(int i=1;i<nums.length;i++){
  13. int temp = nums[i]; //记录操作数
  14. int j = 0;
  15. for(j=i-1;j>=0;j--){
  16. if(nums[j]>temp){
  17. nums[j+1] = nums[j];
  18. }else{
  19. break;
  20. }
  21. }
  22. if(nums[j+1]!=temp){
  23. nums[j+1] = temp;
  24. }
  25. }
  26. //输出结果:
  27. for(int n : nums){
  28. System.out.println(n);
  29. }
  30. }
  31. }
  32. /*
  33. 34 4 56 17 90 65
  34. temp=4
  35. 第一轮:i=1,4要插到34前,就要把34往后挪,变为34,34,56,17,90,65
  36. 再从temp中拿到数:4,34,56,17,90,65
  37. temp=56
  38. 第二轮:i=2,56>34,直接退出:4,34,56,17,90,65
  39. temp=17
  40. 第三轮:i=3 4,34,56,56,90,65
  41. 4,34,34,56,90,65
  42. 4,17,34,56,90,65
  43. temp=90
  44. 第四轮:i=4,90>57,直接退出
  45. temp=65
  46. 第五轮:i=5 4,17,34,56,90,90
  47. 4,17,34,56,65,90
  48. */

4、二分查找

  1. /**
  2. 二分法查找(折半查找):前提是在已经排好序的数组中,
  3. 通过将待查找的元素与中间索引值对应的元素进行比较,若大于中间索引值对应的元素,
  4. 去右半部分查找,否则,去左半部分查找。
  5. 依此类推。直到找到为止;找不到返回一个负数。
  6. */
  7. import java.util.Scanner;
  8. public class Test15{
  9. public static void main(String[] args){
  10. //必须保正数列是有序的
  11. int[] num = {10,20,50,65,88,90};
  12. int index = binarySearch(num,88);
  13. System.out.println(index);
  14. }
  15. //二分查找算法
  16. public static int binarySearch(int[] num,int key){
  17. int start = 0;//开始下标
  18. int end = num.length-1;//结束下标
  19. while(start<=end){
  20. int middle = (start+end)/2; //>>>1
  21. if(num[middle]>key){
  22. end = middle-1;
  23. }else if(num[middle]<key){
  24. start = middle+1;
  25. }else{
  26. return middle;
  27. }
  28. }
  29. return -1;
  30. }
  31. }

5、归并排序

MergeSort(归并排序)算法Java实现 - 九天高远 - 博客园 (cnblogs.com)

19、排序算法 - 图1

算法主要思想

  1. template<class T>
  2. void merge( T r[],T r2[],int s,int mid,int t)
  3. //s为第一个子表首元素的下标,mid为第一个子表末元素的下标
  4. //t为第二个子表末元素的下标
  5. { int i,j,k;
  6. i=s;j=mid+1;k=s; //k是r2的初始指针
  7. while((i<=mid)&&(j<=t))
  8. { k=k+1;
  9. if(r[i].key<=r[j].key){r2[k]=r[i];i++;}
  10. else{r2[k]=r[j];j++;}
  11. }
  12. while(i<=mid){k++;r2[k]=r[i];i++;}
  13. while(j<=t){k++;r2[k]=r[j];j++;}
  14. } //merge

Java实现的二路归并排序的算法如下

  1. package com.chang;
  2. import java.util.Arrays;
  3. public class myMergeSort {
  4. public static void main(String[] args) {
  5. int[] li={26, 5, 98, 108, 28, 99, 100, 56, 34, 1};
  6. printArray("排序前:",li);
  7. guiBingSort(li);
  8. printArray("排序后:",li);
  9. }
  10. private static void printArray(String pre,int[] a) {
  11. System.out.print(pre+"\n");
  12. for(int i=0;i<a.length;i++)
  13. System.out.print(a[i]+"\t");
  14. System.out.println();
  15. }
  16. public static void guiBingSort(int[] li){
  17. System.out.println("开始排序");
  18. mergeSort(li,0,li.length-1);
  19. }
  20. public static void mergeSort(int[] li,int l,int r){
  21. if(l==r){
  22. return;
  23. }
  24. int mid=l+((r-l)>>1);
  25. //二路归并排序里面有两个Sort,多路归并排序里面写多个Sort就可以了
  26. mergeSort(li,l,mid);
  27. mergeSort(li,mid+1,r);
  28. merge(li,l,mid,r);
  29. }
  30. static int number=0;
  31. public static void merge(int[] li, int left ,int mid,int right){
  32. //暂存数组
  33. int[] temp=new int[li.length];
  34. int tIndex=left;
  35. int cIndex=left;
  36. int r1=mid+1;
  37. while(left<=mid && r1<=right){
  38. if(li[left]<=li[r1]){
  39. temp[tIndex++]=li[left++];
  40. }else{
  41. temp[tIndex++]=li[r1++];
  42. }
  43. }
  44. while(left<=mid){
  45. temp[tIndex++]=li[left++];
  46. }
  47. while(r1<=right){
  48. temp[tIndex++]=li[r1++];
  49. }
  50. System.out.println("第"+(++number)+"趟排序:\t");
  51. //将暂存数组中的内容拷贝到原数组
  52. while(cIndex<=right){
  53. li[cIndex]=temp[cIndex];
  54. //输出中间归并排序结果
  55. System.out.print(li[cIndex]+"\t");
  56. cIndex++;
  57. }
  58. System.out.println("");
  59. }
  60. }
  61. /*
  62. 排序前:
  63. 26 5 98 108 28 99 100 56 34 1
  64. 开始排序
  65. 第1趟排序:
  66. 5 26
  67. 第2趟排序:
  68. 5 26 98
  69. 第3趟排序:
  70. 28 108
  71. 第4趟排序:
  72. 5 26 28 98 108
  73. 第5趟排序:
  74. 99 100
  75. 第6趟排序:
  76. 56 99 100
  77. 第7趟排序:
  78. 1 34
  79. 第8趟排序:
  80. 1 34 56 99 100
  81. 第9趟排序:
  82. 1 5 26 28 34 56 98 99 100 108
  83. 排序后:
  84. 1 5 26 28 34 56 98 99 100 108
  85. */