C语言中数组常用的一些排序算法小结

 更新时间:2024年01月11日 10:28:50   作者:猪儿虫21  
数组的排序方法有很多,效率也各不相同,下面这篇文章主要给大家介绍了关于C语言中数组常用的一些排序算法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一.C语言中数组的一些算法

把数据按照从小到大或从大到小 的顺序进行排列

有很多算法:冒泡排序、选择排序、插入排序、快速排序、计数排序、堆排序 .......

常用的有四种:

1.1冒泡排序

主要思想:

总共需要比较n-1轮

每一轮依次比较当前元素和后面的元素,如果当前元素比后面元素大,则交换他们的位置

一轮下来,最大的元素放在了数组最后面

int a[10] = {50,23,80,18,100,5,10,58,30,2};
第一轮:
23,50,18,80,5,10,58,30,2,100
第二轮:
23,18,50,5,10,58,30,2,80,100
......
for(i=0;i<10-1;i++)//比较10-1轮
{
for(j=0;j<10-1-i;j++)
{
if(a[j] > a[j+1])
{
//交换
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}

1.2选择排序

总共需要比较n-1轮

每一轮比较最多只交换一次数据(把最大数字放在最后面位置或把最小的数字放在最前面位置)

#include<stdio.h>
int main()
{
    int a[10] = {50,23,80,18,100,5,10,58,30,2};
    int i,j;
    int temp;
    for(i=0;i<10-1;i++)//进行n-1轮比较
    {
        int max = a[0];//假设最大的数字是a[0]
        int index = 0;//用来保存最大值的下标
        for(j=0;j<10-i;j++)//每一轮比较把最大的数字放在最后面
        {
            if(a[j] > max)
            {
                max = a[j];
                index = j;
            }
        }
        //至此我们已经最大值为 max, 他的下标为index ,交换 a[index] 所在元素和 a[9-i]
        if(index != 9-i)
        {
            temp = a[index];
            a[index] = a[9-i];
            a[9-i] = temp;
        }
    }
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
 }

类似的,把最小的放后面:

#include<stdio.h>
int main()
{
    int a[10] = {50,23,80,18,100,5,10,58,30,2};
    int i,j;
    int temp;
    for(i=0;i<10-1;i++)
    {
        //每一轮比较把最小的数字放在最前面
        int min = a[9];
        int index = 9;
        for(j=0+i;j<10;j++)
        {
            if(a[j]<min)
            {
                min = a[j];
                index = j;
            }
        }
        //至此我们已知最小值为 min ,他的下标为index ,交换 a[index] 所在元素和 a[i]
        if(index != i)
        {
            temp = a[index];
            a[index] = a[i];
            a[i] = temp;
        }
    }
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}

1.3插入排序

算法思想:直接插入排序是无序序列插入到有序序列中,通常假定a[0]为已经排好序的子序列,然后将剩下无序序列一个一个插入到有序的子序列中。适用于基本有序和数据量不大的情况。

#include<stdio.h>
#include<math.h>
int main()
{
    int a[10] = {999,10,15,18,5,30,80,26,345,-10};
    int i,j;
    for(i=1;i<10;i++)//总共需要插入9轮
    {
        //把 a[i] 插入到前面的有序集合中,使之仍然有序
        int data = a[i];
        for(j=i-1;j>=0;j--)
        {
            if(a[j]>data)
            {
                a[j+1] = a[j];
            }
            else
            {
                a[j+1] = data;
                break;
            }
        }
        if(j==-1)
        {
            a[0] = data;
        }
    }
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}

1.4快速排序

1先从数组中选取一个数作为基准点,可随机选择;

2 将数组中大于该基准点的放在该基准点右边,小于该基准点的放在该基准点左边;

3 对左右两个数组进行快速排序。

代码示例:

#include <stdio.h>
//快速排序 有左右两边 因此我需要传进来左右的下标
void FastSort(int a[],int left,int right)
{
    //当左边比右边不得小 我们就没有必要排序了
    if(left >= right)
        return;
    int l = left;
    int r = right;
    //设置基准点 我这里设置的是第一个
    int temp = a[left];
    //将我们的数组进行一次快排
    //将temp的左边变得都比temp小,右边都比temp大
    while(l < r)
    {
        //由于你的基准点是在左边第一个  因此首先就要从右边找到左边
        //将右边小于基准点的元素弄到左边去
        for(;r > l;r--)
        {
            if(temp > a[r])
            {
                //将这个小一点的数弄到左边去
                a[l] = a[r];
                break;
            }
        }
        //然后从左边找到右边去 找到比基准点大的 放在右边去
        for(;r > l;l++)
        {
            if(temp < a[l])
            {
                //将大的数弄到右边去
                a[r] = a[l];
                break;
            }
        }        
    }
    a[l] = temp;//恢复基准点
    //以相同的规则将左边的排序
    FastSort(a,left,l - 1);
    //以相同的规则将右边排序
    FastSort(a,r + 1,right);
}
//打印数组
void PrintArr(int arr[],int n)
{
    for(int i = 0;i < n;i++)
        printf("%d ",arr[i]);
    printf("\n");
}
int main()
{
    int a[] = {12378,34,412,453,34,25,4,432,5,43};
    FastSort(a,0,sizeof(a) / sizeof(a[0]) - 1);
    PrintArr(a,sizeof(a) / sizeof(a[0]));
    return 0;
}

附:C 语言利用数组,按从小到大的顺序排列好n个数,并输出新序列

利用数组排序,可以考虑冒泡排序

冒泡排序是最简单的交换排序方法,通过两两比较关键字,如果发生逆序,就进行交换,从而使关键字小的记录像气泡一样往上“漂浮”,或者使关键字打的记录往下“坠落”

#include<stdio.h>
int main()
{
	int i, j, n, temp;
	int arr[10];
	for (i = 0; i < 10; i++)
		scanf_s("%d", &arr[i]);
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10 - i-1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	printf("\n");
	for (i = 0; i < 10; i++)
		printf("%d ", arr[i]);
	return 0;

}

运行结果:随意输入10个数字

5 45 56 123 456 789 58 989 785 653

5 22 45 56 58 123 456 653 785 789
--------------------------------
Process exited after 20.02 seconds with return value 0
请按任意键继续. . .

总结

到此这篇关于C语言中数组常用的一些排序算法的文章就介绍到这了,更多相关C语言数组排序算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • CLion搭建配置C++开发环境的图文教程 (MinGW-W64 GCC-8.1.0)

    CLion搭建配置C++开发环境的图文教程 (MinGW-W64 GCC-8.1.0)

    这篇文章主要介绍了CLion搭建配置C++开发环境的教程 (MinGW-W64 GCC-8.1.0),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 详解C语言内核中的自旋锁结构

    详解C语言内核中的自旋锁结构

    自旋锁是内核中提供的一种高IRQL锁,用同步以及独占的方式访问某个资源。自旋锁是为了解决内核链表读写时存在线程同步问题。本文将讲解一下自旋锁的简单应用,感兴趣的可以了解一下
    2022-09-09
  • 详解C语言中write函数

    详解C语言中write函数

    write函数,是一个C语言函数,功能为将数据写入已打开的文件内,这篇文章主要介绍了C语言中write函数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • c++中for双循环的那些事

    c++中for双循环的那些事

    本人很菜,今天看《C++编程思想》中的一道课后题中说到这样一个问题。修改两层嵌套的for循环的标识符,观察结果变化
    2013-05-05
  • C++实现LeetCode(143.链表重排序)

    C++实现LeetCode(143.链表重排序)

    这篇文章主要介绍了C++实现LeetCode(143.链表重排序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ opencv图像处理实现灰度变换示例

    C++ opencv图像处理实现灰度变换示例

    这篇文章主要为大家介绍了C++ opencv图像处理灰度变换的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 基于C/C++时间函数的使用详解

    基于C/C++时间函数的使用详解

    本篇文章是对C/C++时间函数的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++解析特殊符号tab和换行符号详情

    C++解析特殊符号tab和换行符号详情

    这篇文章主要给大家介绍的是C++解析一些特殊符号tab、换行符号的一些相关资料,需要的小伙伴可以参考下面文章的具体内容
    2021-09-09
  • 深入了解C++中常用的三个智能指针

    深入了解C++中常用的三个智能指针

    C++是一门强大的编程语言,但是在内存管理方面却存在着一些问题。手动管理内存不仅费时费力,而且容易出错。因此,C++中引入了智能指针这一概念,以更好地管理内存,下面就来详细讲讲C++中常用的三个智能指针吧
    2023-05-05
  • Qt 实现钢笔画线效果示例及详细原理

    Qt 实现钢笔画线效果示例及详细原理

    这篇文章主要介绍了Qt 实现钢笔画线效果示例及详细原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论