冒泡排序实现及优化(Java)

    xiaoxiao2021-03-25  113

    冒泡排序算法的运作如下:

    1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3、针对所有的元素重复以上的步骤,除了最后一个。 4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

    首先简单的第一种实现方法:

    public static int[] bubbleSort1(int[] A, int n) { int i,j; for(i=0; i<n; i++){ for(j = 1 ; j<n-i;j++){ if (A[j-1]>A[j]){ swap(A,j-1,j); } } } return A; } private static void swap(int[] array ,int first ,int second){ int temp; temp = array[first]; array[first] = array[second]; array[second] = temp; }

    对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。如果有一趟没有发生交换,说明排序已经完成。

    public static int[] bubbleSort2(int[] A,int n){ int j; boolean flag = true; while(flag){ flag = false; for(j=1; j<n; j++){ if(A[j-1]>A[j]){ swap(A,j-1,j); flag = true; } } n--; } return A; }

    继续优化,如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。

    public static int[] bubbleSort3(int[] A, int n){ int j; int flag = n; while(flag>0){ flag = 0; for(j=1; j<n; j++){ if(A[j-1]>A[j]){ swap(A,j-1,j); flag = j; } } } return A; }

    排序算法的平均复杂度为O(N^2)。

    转载请注明原文地址: https://ju.6miu.com/read-15351.html

    最新回复(0)