常见排序算法(一) 交换排序

1、冒泡排序

  • 算法思想

邻位交换
若想升序排序,则将大的数值往后面冒,第一轮排序将最大的交换到数组最后一位,第二轮将次大的交换到数组倒数第二位,依次类推。

  • 代码实现
public class BubbleSort
{
    public static int[] bubbleSort(int[] array)
    {
        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])
                {
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
        return array;
    }

    public static void main(String[] args)
    {
        int[] array = new int[]{22,44,77,33,99,66};
        int[] result = bubbleSort(array);
        for(int i = 0; i<result.length;i++)
        {
            System.out.println(result[i]);
        }
    }
}
  • 复杂度
    时间复杂度:O(n^2)
    空间复杂度:O(1)
  • 稳定性
    相邻元素相等时不会交换,稳定性好。
  • 使用场景
    数据量小的情况;基本有序的情况
  • 算法改进
    设置标识位,若当前一轮没有发生任何交换,说明该数组已有序,直接退出,不再执行下一轮比较。加上标识位后,可以将最好时间复杂度降为O(n),初始即为正序情况。

2、快速排序

  • 算法思想

分割 + 递归
1、选择一个基准,一般为中间位或者左侧位;
2、左右两侧往中间走,左边遇到比基准大的,右边遇到比基准小的,两者交换;
3、以基准值为界,将数组分为两部分,分别重复步骤1-2

public class QuickSort
{
    public static void quickSort(int[] arr, int low, int high)
    {
        if(low >= high)
        {
            return;
        }
        int i = low;
        int j = high;
        int pivot = arr[(low + high)/2];

        while(i <= j)
        {
            while(arr[i] < pivot)
            {
                i++;
            }
            while(arr[j] > pivot)
            {
                j--;
            }
            if(i < j)
            {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
                j--;
            }
            else if(i == j)
            {
                i++;
            }
        }
        quickSort(arr,low,j);
        quickSort(arr,i,high);
    }
    public static void main(String[] args)
    {
        int[] array = new int[]{22,44,77,88,189,22,22,35,666,33,99,66};
        quickSort(array, 0, array.length - 1);
        for(int i = 0; i<array.length;i++)
        {
            System.out.println(array[i]);
        }
    }
}
  • 复杂度
    时间复杂度:O(nlogn)

每一次分割后均需遍历所有元素,使用时间O(n)。最好的情况,每次的分割成几乎大小一致的两部分,到达大小为一的数列前,只要做logn次嵌套的调用,调用树的深度是O(logn);最坏的情况,每次分割1和n-1,退化成冒泡排序时间复杂度变为O(n^2)。

空间复杂度:最坏O(n),最好O(logn)

  • 稳定性
    不稳定
  • 使用场景
    数据量大、初始排序随机;基于比较的排序中性能最好。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简单排序 插入排序 想象一下插队的过程... 一个人通过插队的方式排到前面,而将原本在他前面的人挤到了后面的位置。...
    Kasheem_Lew阅读 1,545评论 0 4
  • 该系列文章主要是记录下自己暑假这段时间的学习笔记,暑期也在实习,抽空学了很多,每个方面的知识我都会另起一篇博客去记...
    Yanci516阅读 12,359评论 6 19
  • 一、直接插入排序 直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的元素记录,按其关键字...
    kevin16929阅读 595评论 0 0
  • 拾起一片叶,真巧,怎么会有我们相约的誓言:共创美丽明天。 字迹虽已模糊,叶面早已干枯,但我们的誓言犹存。时间是磨不...
    暮雨晨萧阅读 148评论 0 2
  • 因为爱只有睡过,才知道适不适合自己 只有你自己 才能感受到,其中的无奈和心酸 但炮友关系睡一次就够了,男生迟早会玩...
    遇见桔子阅读 2,459评论 0 0