常见的排序算法

来源:互联网 发布:word彩页用什么软件 编辑:程序博客网 时间:2024/06/17 03:03

        数组的排序是数组常见的操作,也是面试中经常会问道的问题,下面介绍几种常见的数组的排序方法。

1.选择排序法

        原理:假设要按升序排列一个数组。选择排序法先找到数列中最小的数,然后将它放在数列中的最前面。接下来再在剩下的数中选择最小数,将它放在第一个的后面,以此类推,直到数列中仅剩一个数为止。

原理图解:


代码实现:



2.插入排序

    假设希望对一个数列进行递增排序。插入排序法的算法是在已排好序的子数列中反复插入一个新元素来对数列值进行排序的。 

插入排序的图解:


三次循环实现插入排序:


优化:-->二次循环实现插入排序


3.希尔排序

    希尔排序的实质就是分组插入排序,该方法又称缩小增量排序。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

代码实现:

4.冒泡排序:

        冒泡排序的原理比较简单,就是相邻的数字两两比较,大的数字会移动到最后,然后小的数字自然在最前面,称为冒泡。(冒泡排序的优化:如果上一次循环一个数字没交换,可以直接结束循环)。



5 .归并排序

归并排序是通过“归并”操作完成排序的,将两个或者多个有序子表归并成一个子表。归并排序是“分治法”的一个非常典型的应用,同时它也是递归算法的一个好的实例。它将问题分成一些小的问题然后递归求解,而治就是把分阶段的答案拼起来。



归并排序的代码实现(可左右拖动查看代码):

private static void mergeSort(int[]arr){
           mergeSort(arr,newint[arr.length],0,arr.length-1);
     }
private static void mergeSort(int[]arr,int[]temp,intleft,intright){
           if(left<right){
                 intcenter=(left+right)/2;
                 mergeSort(arr,temp,left,center);// 左边
                 mergeSort(arr,temp,center+1,right);// 右边
                 merge(arr,temp,left,center+1,right);// 合并两个有序
           }
     }
private static void merge(int[]arr,int[]temp,intleftPos,intmiddle,intrightEnd){
           intleftEnd=middle-1;// 左边结束下标
           inttempPos=leftPos;// 从左边开始算
           intnumEle=rightEnd-leftPos+1;// 元素个数
           while(leftPos<=leftEnd&&middle<=rightEnd){
                 if(arr[leftPos]<=arr[middle]){
                      temp[tempPos++]=arr[leftPos++];
                 }else{
                      temp[tempPos++]=arr[middle++];
                 }
           }                   
           while(leftPos<=leftEnd){// 左边如果有剩余
                 temp[tempPos++]=arr[leftPos++];
           }
           while(middle<=rightEnd){// 右边如果有剩余
                 temp[tempPos++]=arr[middle++];
           }
           // 将temp复制到arr
           for(inti=0;i<numEle;i++){
                 arr[rightEnd]=temp[rightEnd];
                 rightEnd--;
           }
     }


6 .快速排序

快速排序的基本思想就是取数组的第一个位置作为标志,小于第一位置的放数组左边,大与第一位置的放数组右边,递归进行数组两边的排序。

快速排序的原理:


快速排序的代码实现(代码可左右拖动):

public static void sort(int a[],int low,int hight){
        int i, j;
        if(low > hight){
             return;
        }
        i = low;// 低位
        j = hight;// 高位
        int value = a[i];// 用子表的第一个记录做基准
        boolean flag =true;
        while(i != j){
             if(flag){
                  if(value > a[j]){
                      swap(a, i, j);
                      flag  =false;
                  }else{
                      j--;
                  }
             }else{
                  if(value < a[i]){
                      swap(a, i, j);
                      flag  =true;
                  }else{
                      i++;
                  }
             }
        }
        sort(a, low, i - 1);// 对低子表进行递归排序
        sort(a, i + 1, hight);// 对高子表进行递归排序
    }

    private static void swap(int[] arrays,int i,int j){
        int temp;
        temp = arrays[i];
        arrays[i]= arrays[j];
        arrays[j]= temp;
    }