zoukankan      html  css  js  c++  java
  • 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现

    这五种排序算法难度依次增加。

    冒泡排序:

    第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾。

    第二次将数组的前n-1个元素取出,然后相邻两个元素依次比较,将大的元素往后移,最终n-1个元素中最大的元素又在末尾。

    重复上面的步骤,直到数组只有1个元素为止。因为每次都将上一次比较剩下的最大元素放到末尾,所以当所有比较结束的时候,排序结束。

     1     public void bubbleSort(T[] array)
     2     {
     3         for(int i = array.length-1;i>0; i--)
     4         {
     5             for(int j = 0; j <i; j++)
     6             {
     7                 if(array[j].compareTo(array[j+1]) > 0)
     8                 {
     9                     T temp = array[j];
    10                     array[j] = array[j+1];
    11                     array[j+1] = temp;
    12                 }
    13             }
    14         }
    15     }

    二)选择排序

    选择排序和冒泡排序类似,只是每次循环的时候将最大的元素位置记下来,然后当循环结束的时候,将最大的元素与最末尾元素进行调换。这样,当所有循环结束的时候,数组排序也结束。

     1     @Override
     2     public void selectionSort(T[] array)
     3     {
     4         for(int i = array.length-1; i>0; i--)
     5         {
     6             int max = 0;
     7             for(int j = 0; j <= i; j++)
     8             {
     9                 if(array[max].compareTo(array[j]) < 0)
    10                 {
    11                     max = j;
    12                 }
    13             }
    14             
    15             T temp = array[max];
    16             array[max] = array[i];
    17             array[i] = temp;
    18         }
    19     }

    三)插入排序

    插入排序的思想是遍历整个数组,从第一个元素开始,在遍历过程中将该元素与之前元素比较,将它插入到之前元素的中间,要求是该元素大于前面所有元素,且小于等于后面所有元素。

     1     @Override
     2     public void insertionSort(T[] array)
     3     { 
     4         this.insertionSort(array,0,array.length);
     5     }
     6 
     7     
     8     @Override
     9     public void insertionSort(T[] array, int start, int length)
    10     {
    11         for(int i = start; i < start+length;i++)
    12         {
    13             for(int j = start; j < i; j++)
    14             {
    15                 if(array[i].compareTo(array[j]) < 0)
    16                 {
    17                     T temp = array[i];
    18                     for(int k = i; k > j; k--)
    19                     {
    20                         array[k] = array[k-1];
    21                     }
    22                     array[j] = temp;
    23                 }
    24             }
    25         }
    26     }

    四)希尔排序

    希尔排序是插入排序的升级版。希尔排序会设置一个步长gap,然后不断减小gap,直到gap为1。而每次将数组中长度为gap的元素进行排序。其实就是先对数组进行局部排序,使得数组在总体上有序的,这样在插入排序的时候就不需要进行大规模的数据移动。

     1     @Override
     2     public void shellSort(T[] array)
     3     {
     4         int gap = array.length/2;
     5         while(gap >=1)
     6         {
     7             for(int i = gap; i<array.length; i++)
     8             {
     9                 this.insertionSort(array, i-gap, gap+1);
    10             }
    11             gap = gap/2;
    12         }
    13     }

    五)快速排序

    快速排序会使用到分治法和递归思想。每次排序的时候,选取一个元素,将所有小于它的元素放到左边,将所有大于它的元素放到它的右边。然后将左边和右边的元素分别看成一个数组,然后递归将剩余的元素按照之前的方式排序。当数组长度为1的时候,递归结束,整个数组排序也完成。

     1     @Override
     2     public void quickSort(T[] array)
     3     {
     4         this.quickSortInternal(array, 0, array.length-1);
     5     }
     6     
     7     private void quickSortInternal(T[] array, int left, int right)
     8     {
     9         if(left >= right)
    10         {
    11             return;
    12         }
    13         
    14         int _left = left;
    15         int _right = right;
    16         
    17         boolean flag = false;
    18         while(left!=right)
    19         {
    20             if(flag == false)
    21             {
    22                 //从右向左逼近
    23                 if(array[right].compareTo(array[left]) < 0)
    24                 {
    25                     T temp = array[left];
    26                     array[left] = array[right];
    27                     array[right] = temp;
    28                     //交换后 应该调换方向
    29                     flag = !flag;
    30                 }
    31                 right--;
    32             }
    33             else
    34             {
    35                 //从左向右逼近
    36                 if(array[left].compareTo(array[right]) > 0)
    37                 {
    38                     T temp = array[left];
    39                     array[left] = array[right];
    40                     array[right] = temp;
    41                     //交换后 应该调换方向
    42                     flag = !flag;
    43                 }
    44                 left++;
    45             }
    46         }
    47         //递归
    48         this.quickSortInternal(array, _left, left-1);
    49         this.quickSortInternal(array, right+1, _right);
    50     }
    51 }
  • 相关阅读:
    学习Python的一些Tips
    读书笔记《深入理解计算机系统》(第三版) 第二章 信息的表示
    读书笔记《深入理解计算机系统》(第三版) 第一章 计算机系统漫游
    C 标准库系列之locale.h
    C 标准库系列之limits.h
    C 标准库系列之float.h
    C 标准库系列之errno.h
    C 标准库系列之ctype.h
    C 标准库系列之assert.h
    C 标准库系列之概述
  • 原文地址:https://www.cnblogs.com/kuillldan/p/6065087.html
Copyright © 2011-2022 走看看