三个基础排序方式

(排序皆以从小到大排序)

冒泡排序

思路:

1.指向数组中两个相邻的元素(最开始是数组头两个元素),并且比较它们的大小。

2.如果前面的元素大于后面的元素,交换两个元素的位置。

3.反之则不交换。

4.循环后移,每次将最大的元素移动到最后一个。

public class Sort {
 // 冒泡排序
   public static void bubbleSort(int[] array) {
     // 每次循环,都能冒泡出一个最大元素放在最后,因此需要循环 array.length 次
     for (int i = 0; i < array.length; i++) {
       // 每次遍历,最后的元素已经是最大了,因此可以忽略,只需要遍历 0 到 array.length - i - 1中元素。
       for (int j = 0; j < array.length - i - 1; j++) {
         // 交换元素
         if (array[j] > array[j + 1]) {
           int temp = array[j + 1];
           array[j + 1] = array[j];
           array[j] = temp;
         }
       }
     }
   }

选择排序

思路:

1.先设定两个变量一个记录当前最大值,一个记录当前最大值的位置(索引—index)。

2.依次遍历后面的元素,如果发现比当前最大值大,则将最大值换为此元素,位置改为此元素位置。

3.直到遍历结束,将最大值的元素与最右边元素交换。

4.重复循环,直到排序完成。

public class Sort {
 // 选择排序
   public static void selectSort(int[] array) {
     int max;
     int maxindex;
     //每次循环都选择出一个最大数,放在最后,循环数组长度减一次
     for(int i=0;i<array.length-1;i++){
      max=array[0];
      maxindex=0;
      //遍历寻找每次循环的最大值,每一次循环都已经选出了最大值,所以遍历时要省去最后几位已经选择出来的数 所以循环length-i次
       for(int j=1;j<array.length-i;j++){
       if(max<array[j]){
         max=array[j];
         maxindex=j;
      }
     }
     array[maxindex]=array[array.length-i-1];
     array[array.length-i-1]=max;
    }
   }

插入排序

思路:

1.选择数组倒数第二个元素,作为临时元素。

2.将临时元素与数组后面的元素进行比较,如果后面的元素小于临时元素,后面的元素前移。

3.如果后面的元素大于临时元素,或者已经移动到数组末尾,则将临时元素插入当前的空隙中。

4.重复循环直到排序完成。

public class Sort {
 // 插入排序
   public static void insertSort(int[] array) {
    //从倒数第二个元素开始循环排序,直到第一个元素
     for(int i=array.length-2;i>=0;i--){
       int ls=array[i];//临时元素
       int j=i+1;//j来表示临时元素后面的值
       while(j<=array.length-1){
         if (array[j] < ls) {
           //元素前移,因为临时元素已经提出来了,可以直接前移而不是交换
           array[j - 1] = array[j];
         } else {
           // 如果大于,则直接将临时元素插入,然后退出循环。
           array[j - 1] = ls;
           break;
         }
         j++;
         }
          if(j==array.length){
          //如果达到末尾,将临时元素赋在末尾处
           array[j-1]=ls;
         }
       }
     }

三个排序方式的时间复杂度并没有相差多少,但由于冒泡排序运用“交换”方法最多,因而相对三者而言是较差的。

选择排序与插入排序的运用因情况而定,如果元素数组本身有很多处于正确位置的元素,那么插入排序使用效率相对优秀,反之则用选择排序。

当然就我个人而言,三大排序最为编程的基础,都是需要掌握的重点,且排序直接各有特点、优势,需要认真学习。