排序算法总结——C++实现(未完善)

本文深入讲解了三种基本的排序算法:冒泡排序、选择排序和插入排序。详细介绍了每种算法的步骤,提供了C++代码实现,并分析了它们在不同场景下的应用。适合初学者理解和掌握排序算法的基本原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、排序算法的概述

排序算法种类: 

非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。

线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

算法复杂度:

 

二、冒泡排序

1.步骤

  • 前提条件:假设数组长度为n,目标为升序。
  • 步骤:

    1)遍历数组中的元素,如果arry[Index + 1] < arry[nIndex],则交换arry[Index + 1]和arry[nIndex]中的内容。

    2)对数组进行n次遍历直至所有数据有序。

2.C++实现

void BubbleSort(in arry[], int nSize)
{
    for (int nIndex = 1; nIndex < nSize; ++nIndex)
    {
        for(int nTmpIndex = 0; nTmpIndex < nSize; ++nIndex)
        {
            if (arry[nTmpIndex] > arry[nIndex])
            {
                int nVal = arry[nTmpIndex];
                arry[nTmpIndex] = arry[nIndex];
                arry[nIndex] = nVal;
            }
        }
    }
}

三、选择排序

1.步骤

  • 前提条件:假设数组长度为n,目标为升序。
  • 步骤:

   1)遍历数组中所有元素,将最小的元素插入到无序队列的第一个元素前,形成有序队列。

   2)继续遍历其他无序队列,执行步骤1)

2.C++实现

void SelectionSort(int arry[], int nSize)
{
    for (int nIndex = 0; nIndex < nSize; ++nIndex)
    {
        int nMinValIndex = nIndex;
        
        for (int nTmpIndex = nIndex; nTmpIndex < nSize; ++nTmpIndex)
        {
            if (arry[nTmpIndex] < arry[nMinValIndex])
            {
                nMinValIndex = nTmpIndex;
            }
        }

        int nMinVal = arry[nMinValIndex];
        arry[nMinValIndex] = arry[nIndex];
        arry[nIndex] = nMinVal;
    }
}

四、插入排序

     遍历数组的元素,与前面已经进行过排序的数组进行比对并插入到合适的位置。类似于我们玩扑克牌一样,抓一张牌并按序插入到合适位置

1.步骤

  • 前提条件:假设数组长度为n,目标为升序。
  • 步骤:

    1)依次遍历数组中的元素,元素的索引为nIndex,向前查找

    2)如果存在位置N使得arry[N]小于该元素并且arry[N+1]大于该元素则将该元素插入到N+1的位置。原N+1至nIndex - 1的元素后移一个位置。

  2.C++实现

void InsertSort(int arry[], int nSize)
{
    for (int nIndex = 1; nIndex < nSize; ++nIndex)
    {
        int nInsertIndex = nIndex - 1;
        for (; nInsertIndex >= 0; --nInsertIndex)
        {
            if (arry[nInsertIndex] < arry[nIndex])
            {
                break;
            }
        }

        int nInsertValue = arry[nIndex];

        for (int nTmpIndex = nIndex; nTmpIndex > nInsertIndex + 1; --nTmpIndex)
        { 
            arry[nTmpIndex] = arry[nTmpIndex - 1];
        }
	    arry[nInsertIndex + 1] = nInsertValue;
    }    
}

参考:https://www.cnblogs.com/onepixel/articles/7674659.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值