冒泡算法的运作规律如下:
①、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
②、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数(也就是第一波冒泡完成)。
③、针对所有的元素重复以上的步骤,除了最后一个。
④、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1 public class BubbleSort { 2 public static int[] sort(int[] array){ 3 int i;//这个i控制需要比较多少轮,并且可在外面输出第i轮结果 4 for (i=1;i<array.length;i++) { //i从第一轮开始 5 boolean flag = true; //设一个标记,若下面的for循环未排序 则打断 6 for (int j = 0; j < array.length - i; j++) { //j从0开始,就是下标0,第一号元素 7 if (array[j] > array[j + 1]) { //if语句只要比后面的元素大就交换(每次都是一号元素和后面的比) 8 int temp = array[j]; 9 array[j] = array[j + 1]; 10 array[j + 1] = temp; 11 flag = false; 12 } 13 } 14 if (flag) { 15 break; 16 } 17 System.out.print("第" + i + "轮的结果为:"); 18 display(array); //这里还在第一层for循环里 19 } 20 return array; 21 } 22 23 static void display(int[] array){ //静态方法 可直接调用 数组遍历 24 for (int i=0;i<array.length;i++){ 25 System.out.print(array[i]+" "); 26 } 27 System.out.println(); 28 } 29 }
Test:
1 public class Main { 2 3 public static void main(String[] args) { 4 //随机一组数组 5 int[] array={1,6,4,8,7,9,3,5,2,0}; 6 System.out.print("未排序的数组为:"); 7 //排序数组 8 BubbleSort.display(array); 9 System.out.println("***-----------***"); 10 BubbleSort.sort(array); 11 } 12 }
结果为:
选择排序是每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
分为三步:
①、从待排序序列中,找到关键字最小的元素
②、如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换
③、从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束
代码如下:
1 public class ChoiceSort { 2 public static int[] sort(int[] array){ 3 for (int i=0;i<array.length-1;i++){ //比较轮数 i初始为0是为了从下标0开始比大小 4 int min=i; //记录最小数的下标 5 for (int j=i+1;j<array.length;j++){ //j初始i+1是i后面的所有元素与i进行一次比较 6 if (array[j]<array[min]){ 7 min=j; //如果有比min=i更小的数交换下标 8 } 9 } 10 if (i!=min){ //循环结束i与min不相等就是有更小的数 11 int temp=array[i]; 12 array[i]=array[min]; 13 array[min]=temp; 14 } 15 System.out.print("第"+(i+1)+"轮结果为:"); 16 display(array); 17 } 18 return array; 19 } 20 21 27 }
Test:
1 public class Main { 2 3 public static void main(String[] args) { 4 //随机一组数组 5 int[] array={1,6,4,8,7,9,3,5,2,0}; 6 System.out.print("未排序的数组为:"); 7 //排序数组 8 ChoiceSort.display(array); 9 System.out.println("***-----------***"); 10 ChoiceSort.sort(array); 11 } 12 }
3.(直接)插入排序
直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。
1 package array; 2 3 public class InsertSort { 4 public static int[] sort(int[] array) { 5 int j; 6 for (int i = 1; i < array.length; i++) { 7 int temp = array[i]; //记录要插入的数据 8 j = i; 9 while(j>0&&temp<array[j-1]) { //从插入数据的左边逐次往前比大小 10 array[j] =array[j-1]; //若前面的数值大则往后挪 11 j--; 12 } 13 array[j] = temp; //一直到没有比temp更大的数,插入 此时j已经是往前挪动几步 14 System.out.print("第" + i + "轮的结果为:"); 15 display(array); 16 } 17 return array; 18 } 19 20 static void display(int[] array) { //静态方法 可直接调用 数组遍历 21 for (int i = 0; i < array.length; i++) { 22 System.out.print(array[i] + " "); 23 } 24 System.out.println(); 25 } 26 }
Test:
1 package array; 2 3 public class Main { 4 public static void main(String[] args) { 5 //随机一组数组 6 int[] array = {1, 6, 4, 8, 7, 9, 3, 5, 2, 0}; 7 System.out.print("未排序的数组为:"); 8 //排序数组 9 InsertSort.display(array); 10 System.out.println("***-----------***"); 11 InsertSort.sort(array); 12 } 13 }