1.冒泡排序原理
比较两个相邻的元素,将值大的元素交换至右端
1 int a[] = new int[]{2, 6, 45, 54, 6, 8, 9, 12, 45, 6546, 13, 134, 13, 156, 48, 2}; 2 3 int min; 4 int x = 0; 5 6 for (int i = 0; i < a.length; i++) { 7 for (int j = 0; j < a.length - 1 - i; j++) { 8 x++; 9 if (a[j] > a[j + 1]) { 10 min = a[j + 1]; 11 a[j + 1] = a[j]; 12 a[j] = min; 13 14 } 15 System.out.println(x + "次"); 16 } 17 } 18 for (int i = 0; i < a.length; i++) { 19 System.out.print(a[i] + ","); 20 21 } 22 System.out.println();
2.插入排序
插入排序类似于洗牌的过程,前面的数组默认是正序的,然后从后面的数组中开始抽牌插入到前面的数组中,如果比前面的大直接就是当前位置,如果比前面的一个小,
继续向前比较,直到找到比前面的大的,插入到当前位置
但和插入扑克牌有一点不同,不可能在两个相邻的存储单元之间再插入一个单元,因此要将插入点之后的数据依次往后移动一个单元。也就是代码18行
代码实现:
1 /** 2 * 插入排序 3 */ 4 int b[] = new int[]{2, 6, 45, 54, 6, 8, 9, 12, 45, 6546, 13, 134, 13, 156, 48, 2}; 5 6 7 int i, j; 8 int n = b.length; 9 int target; 10 11 //假定第一个元素被放到了正确的位置上 12 //这样,仅需遍历1 - n-1 13 for (i = 1; i < n; i++) { 14 j = i; 15 target = b[i]; 16 17 while (j > 0 && target < b[j - 1]) { 18 b[j] = b[j - 1]; 19 //b[j-1]=target; 20 j--; 21 } 22 23 24 b[j] = target; 25 } 26 for (int i1 = 0; i1 < b.length; i1++) { 27 System.out.print(b[i1] + ","); 28 }
3.选择排序
选择排序就是进行n-1轮比较 每轮比较至多交换一次 先设最小值为本轮比较初始值 然后比这个值小的就变为最小值,
最后那个肯定是本轮最小值的坐标,然后看初始最小值和最后的最小值得坐标是否相同,若不同则交换位置,相同则不交换
1 int a[]=new int[]{3,21,12,5,5,47,564,64,13,48,12,3,4,5,3,87,54,98}; 2 for(int i=0; i<a.length-1; i++){ 3 int min=a[i];//最小的数 4 int minIndex=i ; 5 for(int j=i+1;j<a.length;j++){//从第二个数开始循环比较 6 if(a[j]<min){//如果后面的小于最小的 7 min=a[j];//改变最小数的值 8 minIndex=j; 9 } 10 } 11 //最小数跟第i位置上的交换 所以要记录下标 12 int temp = a[i]; 13 a[i] = min; 14 a[minIndex] = temp; 15 } 16 17 for (int i=0;i<a.length;i++){ 18 System.out.print(a[i]+","); 19 }
总结:插入排序算法比冒泡快一倍,比选择排序略快一点,但这些算法都是O(N2)的时间级别。