一、冒泡排序
- 先抛出主程序
package Sort; public class BubbleSort { public static void main(String[] args) { int [] a = {2,5,6,7,1,8,9}; BubbleSort3( a, 6); for(int k = 0; k <= 6; k++){ System.out.println(a[k]); } } static void BubbleSort3(int [] a, int n){ int i = 0; int j = 0; boolean flag = true; for (i=0; i<=n && flag==true; i++){ flag = false; for (j=n; j>=(i+1); j--){ if (a[j] < a[j-1]){ swap(a, j, i); flag = true; } } } } static void BubbleSort2(int [] a, int n){ int i = 0; int j = 0; for (i=0; i<=n; i++){ for (j=n; j>=(i+1); j--){ if (a[j] < a[j-1]){ swap(a, j, i); } } } } static void BubbleSort1(int [] a, int n){ int i = 0; int j = 0; for (i=0; i<=n; i++){ for (j=i+1;j<=n; j++){ if (a[j] < a[i]){ swap(a, j, i); } } } } static void swap(int [] num,int j, int i){ int temp; temp = num[i]; num[i] = num[j]; num[j] = temp; } }
- 冒泡排序初级版本
static void BubbleSort1(int [] a, int n){ int i = 0; int j = 0; for (i=0; i<=n; i++){ for (j=i+1;j<=n; j++){ if (a[j] < a[i]){ swap(a, j, i); } } } }
严格意义上讲,这只是对顺序表作交换排序,时间复杂度分析为O(N2)。而且由于swap操作只要在满足后值小于当前值的情况下就进行,而不是与后续值最小的值进行交换,所以就增多了很多不必要的操作。
- 冒泡排序正式版
static void BubbleSort2(int [] a, int n){ int i = 0; int j = 0; for (i=0; i<=n; i++){ for (j=n; j>=(i+1); j--){ if (a[j] < a[j-1]){ swap(a, j, i); } } } }
这个版本与上一个的区别是,内循环从j=n开始,那么效果就是,相邻比较,小的上升,这就是冒泡排序的命名由来。这个算法会在每一次外循环中,就会把小的值往顺序表前移。但是在当我们的表已经是有顺序的,只是某几位不同的情况呢?我们有一种优化措施。
- 冒泡排序正式优化版
static void BubbleSort3(int [] a, int n){ int i = 0; int j = 0; boolean flag = true; for (i=0; i<=n && flag==true; i++){ flag = false; for (j=n; j>=(i+1); j--){ if (a[j] < a[j-1]){ swap(a, j, i); flag = true; } } } }
可以看到我们加入了一个标志位flag,但上次循环没有改变顺序时,说明此时表已经有序,则停止继续循环。冒泡排序的时间复杂度是O(N2)。
二、简单选择排序
- 先抛出主程序
package Sort; public class SimpleSelectSort { public static void main(String[] args) { int [] a = {8,4,5,2,1,7}; SimpleSelectSort1(a, 5); for(int k = 0; k <= 5; k++){ System.out.println(a[k]); } } static void SimpleSelectSort1(int [] a, int length){ int i,j,min; for ( i=0; i<=length; i++) { min = i; for ( j=i+1; j<=length; j++) { if (a[j] < a[min]) { min = j; } } if(i != min) swap(a, i, min); } } static void swap(int [] num,int j, int i){ int temp; temp = num[i]; num[i] = num[j]; num[j] = temp; } }
- 简单选择排序分析
简单排序的原理是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,和第i个记录交换之。
static void SimpleSelectSort1(int [] a, int length){ int i,j,min; for ( i=0; i<=length; i++) { min = i; for ( j=i+1; j<=length; j++) { if (a[j] < a[min]) { min = j; } } if(i != min) swap(a, i, min); } }
简单排序的时间复杂度也是O(N2)。这也是业内为何推崇归并排序和快速排序的原因,因为他们的时间复杂度是O(N)。我会在以后的随笔中介绍。