【排序】排序这样写才对Ⅰ --插入排序与选择排序

这篇具有很好参考价值的文章主要介绍了【排序】排序这样写才对Ⅰ --插入排序与选择排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 【排序】排序这样写才对Ⅰ --插入排序与选择排序

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

目录

0.排序的概念及常见的算法:

0.1排序的概念:

0.2常见的算法:

1.直接插入排序:

1.1直接插入排序代码实现:

2.希尔排序:

2.1希尔排序代码实现:

3.选择排序:

3.1单路选择代码实现:

3.2双路选择代码实现:

4.堆排序:

4.1堆排序代码实现:

完结撒花:

【排序】排序这样写才对Ⅰ --插入排序与选择排序 

0.排序的概念及常见的算法:

0.1排序的概念:

--------------------------------------------------------------------------------------------------------------------------

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

--------------------------------------------------------------------------------------------------------------------------
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

--------------------------------------------------------------------------------------------------------------------------
内部排序:数据元素全部放在内存中的排序。

--------------------------------------------------------------------------------------------------------------------------
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序
--------------------------------------------------------------------------------------------------------------------------

总的来说就是:让一串的数据,按照使用者想要的顺序尽行展示.

0.2常见的算法:

【排序】排序这样写才对Ⅰ --插入排序与选择排序

常见的排序算法有这些.将会分成几个章节讲完,感兴趣的uu们可以关注下我的排序专栏,方便和后期观看.

这章重点讲前两种排序:插入排序与选择排序.

1.直接插入排序:

顾名思义,其的运行原理为:选出一个数,不断与其之前的数据比较.在排升序的前提下,若目标值比其前一个小,则继续往前比较.比到目标值比齐前一个大为止.其时间复杂度为O(N^2)

【排序】排序这样写才对Ⅰ --插入排序与选择排序

这个排序与我们之前玩过的抽牌很像,想想是不是这样.【排序】排序这样写才对Ⅰ --插入排序与选择排序 那我们直接来写写代码看看.

1.1直接插入排序代码实现:

void insertsort(int *a,int n)
{
    for(int j=1;j<n;j++)
    {
        int tmp=a[j];
        int end=j-1;
        while(end>=0)
        {
            if(tmp<a[end])
            {
                a[end+1]=a[end];
                end--;
            }
            else break;
        }
        a[end+1]=tmp;
    }
}

 注意这里需要先将a[j]的值,也就是目标值存储起来,否则在end后移的过程中,会将a[j]覆盖

2.希尔排序:

希尔排序不是一种新的排序.其是在插入排序的基础上改进的一种排序.其时间复杂度不稳定,

一般为O(N^1.25)--O(1.6N^1.25)

其核心思想为:

先将待排序数组的间隔gap位进行插入排序.之后gap不断缩减.最后仍然是做插入排序,也可以将直接插入排序看作为gap为一的希尔排序,当gap<1时停止

(这里因为已经有序了,所以就没有展现出gap为一的情况)

【排序】排序这样写才对Ⅰ --插入排序与选择排序

我们拿插入排序的代码来看看:

        也就是j依然每次往前移一位.在直接插入排序中,end初始为j-1,end每次跳一位.

                                                    在这里初始值为j-gap且每次跳gap位.

需要注意gap的取值可以任意,但需要满足最后会变成1的情况.也就是直接插入排序,临位调整的情况.(一般取值为:len/2或者len/3+1)

2.1希尔排序代码实现:

void shellsort(int *a,int n)
{
    int gap=n/2;
    while(gap>=1)
    {
        for(int j=0;j<n;j++)
        {
            int tmp=a[j];
            int end=j-gap;
            while(end>=0)
            {
                if(tmp<a[end])
                {
                    a[end+gap]=a[end];
                    end-=gap;
                }
                else break;
            }
            a[end+gap]=tmp;
        }
        gap/=2;
    }
}

3.选择排序:

依然顾名思义,其就是选择出一个最大/最小的值放在其左边/右边,然后不断缩减区间 ,即可完成.其时间复杂度为:O(N^2),我们一般不使用他

【排序】排序这样写才对Ⅰ --插入排序与选择排序

 这里给出两种代码方案:

3.1单路选择代码实现:

选择最小的放在左边

void selectsort(int *a,int n)
{
    for(int i=0;i<n;i++)
    {
        int min=a[i];
        for(int j=i+1;j<n;j++)
        {
            if(a[j]<min)
            {
                swap(a[j],min);
            }
        }
        a[i]=min;
    }
}

3.2双路选择代码实现:

从两个方向选择最大最小,然后依次放在左右,并缩减区间.

这里有个问题,若发生最大的值在左边,第一次交换完会改变,max值指向的内容

【排序】排序这样写才对Ⅰ --插入排序与选择排序

 所以要进行一次判定,若max==left,则说明真正的max被换到了刚刚min的位置,此时我们需要让max=min

 【排序】排序这样写才对Ⅰ --插入排序与选择排序

void selectsort(int *a,int n)
{   
    int left=0,right=n-1;
    while(left<=right)
    {
        int max=right,min=left;
        for(int i=left+1;i<right;i++){
            if(a[max]<a[i])
            {
                max=i;
            }
            else if(a[min]>a[i])min=i;
        }
        swap(a[min],a[left]);
        if(max==left)max=min;
        swap(a[max],a[right]);
        left++,right--;
    }
}

4.堆排序:

这里前面介绍过了,就不再赘述.uu可以看 这篇文章 其时间复杂度为O(N*logN)

4.1堆排序代码实现:

void heapSort(HDataType *a,int n)
{
	/*for (int i = 1; i < n; i++)
	{
		UpAdjust(a, i);
	}*/
	for (int i = (n - 1 - 1 / 2); i >= 0; i--)
	{
		DownAdjust(a, n,i);
	}
 
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[end], &a[0]);
		end--;
		DownAdjust(a, end,0);
		
	}
}	

完结撒花:

🌈本篇博客的内容【排序这样写才对Ⅰ --插入排序与选择排序】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!文章来源地址https://www.toymoban.com/news/detail-409166.html

到了这里,关于【排序】排序这样写才对Ⅰ --插入排序与选择排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 冒泡排序 简单选择排序 插入排序 快速排序

    bubblesort 两个for循环,从最右端开始一个一个逐渐有序 selectsort 假设是升序,两个for循环,从最左端开始一个一个逐渐有序,找到lengh-1个无序区的最小值 insertsort 两个for循环,从最左端开始一个一个逐渐有序,默认第一个就是有序区,第一个for遍历无序区,第二个for循环遍历

    2024年02月13日
    浏览(37)
  • 排序的概念,插入排序,希尔排序,选择排序

    排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而

    2024年02月12日
    浏览(21)
  • 排序算法(初阶)【冒泡,插入,选择排序】

    比较相邻的两个元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这被称为一趟冒泡排序 这样就可以把数组中要排序的数中的最大值放到最后,也相当于把一个元素排在了元素有序时它应处于的位置,它既

    2024年01月21日
    浏览(40)
  • 排序算法一:冒泡、选择、插入排序

    目录         冒泡排序 理论 代码实现 时间复杂度 选择排序 理论 代码实现  时间复杂度 插入排序 理论分析 代码实现 时间复杂度    冒泡,我们很容易联想到水煮沸,或者是鱼儿吐泡的情景,水泡会在水中上升到达水面。冒泡排序正如其名,即大的数一个个往上冒出来。

    2024年02月22日
    浏览(32)
  • Java实现:选择排序、冒泡排序、插入排序

    本文我们将使用Java编程语言实现经典的选择排序、冒泡排序和插入排序算法,并用对数器进行测试。 选择排序的基本思想是:遍历数组,每次找到数组中最小的元素,将其放到数组的前端。接着,在剩余的元素中继续寻找最小的元素,将其放在已找到的最小元素之后。重复

    2024年02月02日
    浏览(23)
  • 十大排序算法之插入排序、希尔排序、选择排序

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 本篇主要讲解八大排序算法中的三种排序,分别是: 插入排序、希尔排序、选择排序 。 在我们的日常生活最常见的一个场景就是斗地主,

    2023年04月16日
    浏览(30)
  • 八大排序(一)冒泡排序,选择排序,插入排序,希尔排序

    冒泡排序的原理是: 从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。 以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会

    2024年02月08日
    浏览(29)
  • 【数据结构】排序之插入排序和选择排序

    🔥 博客主页: 小王又困了 📚 系列专栏: 数据结构 🌟 人之为学,不日近则日退 ❤️ 感谢大家点赞👍收藏⭐评论 ✍️ 目录 一、排序的概念及其分类 📒1.1排序的概念 📒1.2排序的分类 二、插入排序 📒2.1直接插入排序 🎀2.1.1直接插入排序的思想 🎀2.1.2排序步骤  🎀2

    2024年02月08日
    浏览(28)
  • 数据结构与算法—插入排序&选择排序

    目录 一、排序的概念 二、插入排序   1、直接插入排序  特性总结: 2、希尔排序 特性总结:  三、选择排序 1、直接选择排序  特性总结: 2、堆排序—排升序(建大堆) 向下调整函数 堆排序函数 特性总结: 代码完整版:   头文件  函数文件  测试文件 排序 :所谓排序,

    2024年01月20日
    浏览(45)
  • (搞定)排序数据结构(1)插入排序 选择排序+冒泡排序

    目录 本章内容如下    一:插入排序                               1.1插入排序                   1.2希尔排序     二:选择排序                    2.1选择排序  三:交换排序                    3.1冒泡排序         1.1直接插入排序   

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包