Java 通用的各种排序方法

霸气de小男生 提交于 2019-11-27 12:26:13

1.选择排序
选择排序就是对数组中的元素进行比较选择,然后直接放置在排序后的位置

代码:在主方法main中定义一个数组并设置值,然后调用selectSort方法并给它参数值然后执行。

selectSort方法中写一个for循环,n8表示的是数组中的总数,判断如果i<n-1,满足条件时执行下一个for循环,找出最小值的元素下标,第一遍j=i+1(1=0+1),满足j<n条件,然后比较赋值,最后输出每一次执行的结果。

public static void main(String[] args) {

    int [] arr = {19,38,5,17,12,8,27,29};

    selectSort(arr,arr.length);

}

public static void selectSort(int [] arr,int n){

   for (int i = 0; i < n - 1; i++) {

   int index = i;

   int j;

   // 找出最小值的元素下标

   for (j = i + 1; j < n; j++) {

       if (arr[j] < arr[index]) {

           index = j;

       }

   }

   int tmp = arr[index];

   arr[index] = arr[i];

   arr[i] = tmp;

      System.out.println(Arrays.toString(arr));

   }

}

运行结果:

2.冒泡排序

冒泡排序一次只比较两个数字,并且这两个数字是相邻的。

代码:第一次比较首先比较第0位和第一位,并且将结果大的数字往后移动,也就是交换,如果两个数比较前一位小于后一位不进行交换。

public static void main(String[] arry){

     int[] a = { 56, 15, 78, 97, 21, 34, 5, 11 };

     for (int i = 0; i < a.length - 1; i++){//外层循环是排序的趟数

         for (int j = 0; j < a.length - 1 - i; j++){//内层循环是当前趟数需要比较的次数

           if (a[j] > a[j + 1]) {

                    int b = a[j];

                    a[j] = a[j + 1];

                    a[j + 1] = b;

                }

            }

        }

      System.out.println("冒泡排序(从小到大)");

      for (int c : a) {

         System.out.println(c);

      }

}

运行结果:

3.插入排序

插入排序的工作方式非常像人们排序一手扑克牌一样。开始时,我们的左手为空并且桌子上的牌面朝下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,然后直接插入相对的顺序中。

代码public static void main(String[] args) {

            int[] arr={56, 15, 78, 97, 21, 34, 5, 11 };

            insertSort(arr);

            for (int i = 0; i < arr.length; i++) {

                System.out.print(arr[i]+" ");

            }

        }

     private static void insertSort(int[] arr) {

        int temp = 0;

        for (int i = 1; i < arr.length; i++) {

            if (arr[i] < arr[i-1]) {

                temp = arr[i];

                int j = 0;

                for (j = i - 1; j >= 0 && temp < arr[j]; j--) {

                    arr[j+1]=arr[j];

                }

                arr[j+1]=temp;

            }

        }

}

运行结果:

4.快速排序

快速排序,说白了就是给基准数据找其正确索引位置的过程. 

代码:从待排序的记录序列中选取一个记录(通常第一个)作为基准元素(称为key)key=arr[left],left指向数列的最左部,right指向数据的最右部, key首先与arr[right]进行比较,如果arr[right]<key,则arr[left]=arr[right]将这个比key小的数放到左边去,如果arr[right]>key则我们只需要将right--,right--之后,再拿arr[right]与key进行比较,直到arr[right]<key交换元素为止,如果右边存在arr[right]<key的情况,将arr[left]=arr[right],接下来,将转向left端,拿arr[left ]与key进行比较,如果arr[left]>key,则将arr[right]=arr[left],如果arr[left]<key,则只需要将left++,然后再进行arr[left]与key的比较。重复循环这个过程最终得到一个有序的数列。

public static void main(String[] args) {

          int arr[]= {56, 15, 78, 97, 21, 34, 5, 11};

          System.out.println("排序前:"+Arrays.toString(arr));

          quickSort(arr,0,arr.length-1);

          System.out.println("排序后:"+Arrays.toString(arr));

       }

       public static void quickSort(int [] arr,int left,int right) {

          int pivot=0;

          if(left<right) {

             pivot=partition(arr,left,right);

             quickSort(arr,left,pivot-1);

             quickSort(arr,pivot+1,right);

          }

       }

       private static int partition(int[] arr,int left,int right) {

          int key=arr[left];

          while(left<right) {

             while(left<right && arr[right]>=key) {

                right--;

             }

             arr[left]=arr[right];

             while(left<right && arr[left]<=key) {

                left++;

             }

             arr[right]=arr[left];

          }

          arr[left]=key;

          return left;

   }

运行结果:

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!