排序算法(一)

排序算法是算法的入门知识,在面试中经常被问到排序算法及相关的问题,因此在学习的同时做一次总结。欢迎访问作者的个人博客

冒泡排序

基本思想:是从左到右两两比较相邻数据,若反序则进行交换。第一轮比较从0~N-1;第二轮0~N-2……最后一轮比较0~1

时间复杂度:O(n)~O(n^2)

C代码:

void bubble_sort(int a[], int N)
{
    for (int i=0; i<N-1; i++)
    {
        for (int j=0; j<N-1-i; j++)
        {
            if (a[j] > a[j+1])
            {
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
}

优化:设置标志位,若某一轮没有任何元素位置发生变化,则排序完成。

优化代码:

void bubble_sort(int a[], int N)
{
    int sort = 1;
    for(int i=0; i<N-1; i++)
    {
        for(int j=0; j<N-1-i; j++)
        {
            if(a[j] > a[j+1])
            {
                sort = 0;
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
        if(sort) break;
    }
}

选择排序

基本思路:在0~N-1选最小值放在0位置;在1~N-1选最小值放在1位置……在N-2~N-1选最小值放在N-2位置。

时间复杂度:O(n^2)

C代码:

void select_sort(int a[], int N)
{
    for(int i=0; i<N-2; i++)
    {
        for(int j=i+1; j<N; j++)
        {
            if(a[i] > a[j])
            {
                int temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
}

插入排序

基本思路:先比较位置0、1两数,小值置左;再将位置2的数与已排好序的队列从右向左依次比较,小值置左;再将位置3的数与已排好序的队列从右向左依次比较,小值置左……最后将位置N-1的数与已排好序的队列从右向左依次比较,小值置左。

时间复杂度:O(n^2)

C代码:

void insert_sort(int a[], int N)
{
    for(int i=0; i<N-1;i++)
    {
        for(int j=i+1; j>0; j--)
        {
            if(a[j-1] > a[j])
            {
                int temp = a[j-1];
                a[j-1] = a[j];
                a[j] = temp;
            }
        }
    }
}

同样可以设置标志位进行优化:

void insert_sort(int a[], int N)
{
    int sort = 1;
    for(int i=0; i<N-1;i++)
    {
        for(int j=i+1; j>0; j--)
        {
            if(a[j-1] > a[j])
            {
                sort = 0;
                int temp = a[j-1];
                a[j-1] = a[j];
                a[j] = temp;
            }
            if(sort) break;
        }
    }
}

结语

本篇文章总结了时间复杂度为O(n^2)的排序算法。如果对您有所帮助,欢迎对作者进行打赏,万分感谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排序(Sort)是计算机程序设计中十分常见且重要的操作。是将一个数据元素的序列,重新排列成一个按关键字有序的序列。...
    f9220927560a阅读 496评论 0 0
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,754评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,241评论 0 52
  • 排序是笔试面试的常考知识点,检验应聘者对排序这类基本算法的接受程度和数据结构的理解。在2017春季暑期实习生招聘过...
    Chuck_Hu阅读 245评论 0 0
  • 《妫 水 河 游 记》 作者 心兮若云(烟柳斜阳) 很小的时候就喜欢读唐诗宋词,而唐诗宋词中尤喜欢描写江南...
    烟柳斜阳阅读 1,267评论 0 2