面试中可能被问到的常用排序算法

排序算法是一种比较简单的算法,从我们一开始接触计算机编程开始接触的可能就是排序或者搜索一类的算法,但是因为排序在其他的一些算法中应用较多,所以为了提高性能已经研究了多种排序算法。目前区别排序算法主要还是以时间复杂度,空间复杂度,稳定性等来排序,接下来我们分别分析。

稳定性算法

区别一个排序算法是否是稳定算法只需看相同的关键字在排序完成后是否保持原来两者的前后关系即可,比如对于[1,2,3,4,1],a[0]=a[4],a[0]在a[4]之前,稳定的排序在排序完成后a[0]依旧在a[4]的前面,反之则是不稳定排序算法。

冒泡排序

基本原理

冒泡排序(Bubble Sort)是一种比较简单的排序算法。基本原理为选定一个数作为比较标准,遍历整个数组比较两个数的大小,如果顺序不对则进行交换,知道没有再需要交换的数为止。冒泡排序是稳定的排序算法
 冒泡排序算法的运作如下:
1.比较相邻的两个元素。并根据需要进行交换,如果需要正序,那么就将较大的放在后面,倒叙则将较小的放在后面。
2.对每一组相邻元素同样的操作。这步做完后,最后的元素会是最大的数。
3.外循环对除已经选择出的元素重复上面的步骤,直到没有任何一对数字需要比较,表示排序已经完成。

代码
    public static void bubbleSort(int[] arr){
        for(int i=0;i<arr.length;i++){
            for(int j=0;j<arr.length-i-1;j++){
                if(arr[j] > arr[j+1]){
                    swap(arr, j, j+1);
                }
            }
        }
    }

复杂度

如果序列的初始状态是正序的,一趟扫描即可完成排序,不需要交换操作。经过n次的循环后排序完成,所以时间复杂度为O(n),整个过程没有使用辅助空间,空间复杂度为O(1)。

选择排序

选择排序(Selection sort)是一种很简单排序算法。它要求是每一次从待排序的元素中选出最小(最大)的一个元素,存放在起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到上一位已经排好序的后面。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

选择排序算法的运作如下:
1.第一次遍历整个数据序列,查找出最大(小)的数。并将该数放在第一位置。
2.将已经排序好的位置除外,剩下的数据序列重复进行上面的操作。

代码
    public static void insertSort(int[] arr){
        for(int i=0;i<arr.length;i++){
            //一趟之后最小的数到了下标为i的位置
            for(int j=i+1;j<arr.length;j++){
                if(arr[i] > arr[j]){
                    swap(arr, i, j);
                }
            }
        }
    }

复杂度

如果数据本身就是有序的,0次交换;最坏的情况下需要进行n-1次交换;比较操作次数固定为N^2/2,时间复杂度为O(n^2),空间复杂度为O(1)。

直接插入排序

插入排序是比较简单的排序方法,插入排序将待排序数组分为两部分,一部分是已排序部分,另一部分则是待排序部分。最开始仅第一个数字为已排序部分。然后每次从待排序部分取出一个数,同已排序部分的数据进行比较,选出刚好前一个数比该数小,后一个数比该数大(第一位除外),将该数放在这个位置。进过遍历后整个数组有序。

选择排序算法的运作如下:
1.将第一个数选择为已排序部分,取第二个数同第一个数比较,如果大于第一个数则不变,小于则交换位置。上述过程完成后将前两个数字作为已排序部分。
2.再次从待排序部分取出一个数字,重复上诉步骤找出该数的位置。从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
3.重复上面的步骤直到将数据全部遍历完成则表示数组有序。

代码
    public static void insertSort(int[] nums){
        int i,j;
        for(i=1;i<nums.length;i++){
            int temp = nums[i];
            //将元素后移
            for(j=i-1;j>=0&&temp<nums[j];j--){
                nums[j+1] = nums[j];
            }
            nums[j+1] = temp;
        }

}

复杂度

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/41faa030097a86d44aa9ade018b3973d.html