• Java中选择排序,冒泡排序,插入排序,快速排序


    一:冒泡法排序  

       //冒泡排序 注:从小到大排
       //特点:效率低,实现简单
      //思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。

                    这只是冒泡排序的一种,当然也可以从后往前排。

    算法步骤

    • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

    • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

    • 针对所有的元素重复以上的步骤,除了最后一个。

    • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

     动画演示

        

     参考代码

       public static void bubbleSort(int array[]) {
        int t = 0;
        for (int i = 0; i < array.length - 1; i++)
           for (int j = 0; j < array.length - 1 - i; j++)
            if (array[j] > array[j + 1]) {
            t = array[j];
            array[j] = array[j + 1];
           array[j + 1] = t;
           }
        }

    二:选择排序

        //选择排序 从小到大

        //特点:效率低,容易实现。
        //思想:每一趟从待排序序列选择一个最小的元素放到已排好序序列的末尾,剩下的为待排序序列,重复上述步骤直到完成排序。

      算法步骤

    • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

    • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

    • 重复第二步,直到所有元素均排序完毕。

       动画演示

       参考代码

       public static void selectSort(int array[]) {
         int t = 0;
         for (int i = 0; i < array.length - 1; i++){
           int index=i;
            for (int j = i + 1; j < array.length; j++)
               if (array[index] > array[j])
                index=j;
               if(index!=i){ //找到了比array[i]小的则与array[i]交换位置
                 t = array[i];
                 array[i] = array[index];
                 array[index] = t;
                 }
              }
           }

    三:插入排序
         //插入排序 从小到大
         //特点:效率低,容易实现。
         //思想:将数组分为两部分,将后部分元素逐一与前部分元素比较,如果前部分元素比array[i]小,就将前部分元素往后移动。当没有比array[i]小的元素,即是                    合理位置,在此位置插入array[i]

      算法步骤

    • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

    • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

      动画演示

         

       参考代码

       public static void insertionSort(int array[]) {
             int i, j, t = 0;
              for (i = 1; i < array.length; i++) {
                 if(array[i]<array[i-1]){
                  t = array[i];
                 for (j = i - 1; j >= 0 && t < array[j]; j--)
                 array[j + 1] = array[j];
                 //插入array[i]
                array[j + 1] = t;
                   }
                }
            }

    四:快速排序
        //快速排序 从小到大
        //特点:高效,时间复杂度为nlogn。
        //采用分治法的思想:首先设置一个轴值pivot,然后以这个轴值为划分基准将待排序序列分成比pivot大和比pivot小的两部分,

           接下来对划分完的子序列进行快排直到子序列为一个元素为止。

     算法步骤

    • 从数列中挑出一个元素,称为 “基准”(pivot);

    • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

    • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

      动画演示

      参考代码

         public static void quickSort(int array[], int low, int high) {// 传入low=0,high=array.length-1;
          int pivot, p_pos, i, t;// pivot->位索引;p_pos->轴值。
           if (low < high) {
                 p_pos = low;
                 pivot = array[p_pos];
                 for (i = low + 1; i <= high; i++)
                     if (array[i] < pivot) {
                          p_pos++;
                         t = array[p_pos];
                         array[p_pos] = array[i];
                         array[i] = t;
                    }
                  t = array[low];
                  array[low] = array[p_pos];
                  array[p_pos] = t;
                  // 分而治之
                 quickSort(array, low, p_pos - 1);// 排序左半部分
                 quickSort(array, p_pos + 1, high);// 排序右半部分
                }
            }

     五:测试

    package com.svse.paixu;
    import java.util.Arrays;
    public class JavaSort {

      //打印方法

      public static void print(int[] arr) {

      System.out.print("[");
      for (int i = 0; i < arr.length; i++) {
         if(i == arr.length-1) {
            System.out.println(arr[i] + "]");
          }else {
            System.out.print(arr[i] + ",");
          }
        }
      }

       public static void main(String[] args) {
        int[] array = { 37, 47, 23, 100, 19, 56, 56, 99, 9 };

        print(array);//排序前
        //JavaSort.bubbleSort(array);//冒泡排序
        //JavaSort.selectSort(array);//选择排序
        //JavaSort.insertionSort(array);//插入排序
        JavaSort.quickSort(array, 0, array.length-1);//快速排序
        System.out.println("排序后:" + Arrays.toString(array));

          print(array);//排序后
        }
    }

       六:各种排序算法性能比较

     

  • 相关阅读:
    go ERROR invalid character '<' looking for beginning of value
    C#实现将网址生成二维码图片
    二、WPF入门教程——Bingding学习
    一、WPF入门教程——创建WPF项目
    C#实现DataTable行列转置
    VBS整蛊代码
    Task.WhenAll和Task.WhenAny
    Task.WaitAll和Task.WaitAny
    CancellationTokenSource
    组合ContinueWith
  • 原文地址:https://www.cnblogs.com/zhaosq/p/9857713.html
Copyright © 2020-2023  润新知