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语言数组排序算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C/C++实现双路快速排序算法原理

    C/C++实现双路快速排序算法原理

    这篇文章主要为大家详细介绍了C/C++实现双路快速排序算法原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • C/C++实现手写数字识别的示例详解

    C/C++实现手写数字识别的示例详解

    这篇文章主要为大家详细介绍了如何使用C/C++实现手写数字识别,分别处理 32*32 文本数据集和mnist 28*28 png数据集,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-10-10
  • C++利用socket传输大文件的实现代码

    C++利用socket传输大文件的实现代码

    这篇文章主要为大家详细介绍了C/C++如何使用socket传输大文件的实现代码,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-10-10
  • C++ opencv图像处理实现图像腐蚀和膨胀示例

    C++ opencv图像处理实现图像腐蚀和膨胀示例

    这篇文章主要为大家介绍了C++ opencv图像处理实现图像腐蚀和图像膨胀示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • OpenCV视频流C++多线程处理方法详细分析

    OpenCV视频流C++多线程处理方法详细分析

    为OpenCV是搞计算机视觉必须要掌握的基础,这篇文章主要给大家介绍了关于OpenCV视频流多线程处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • C语言获取文件长度的方法

    C语言获取文件长度的方法

    这篇文章主要介绍了C语言获取文件长度的相关知识,包括使用标准库方法和使用Linux系统调用,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • C语言链表实现通讯录系统课程设计

    C语言链表实现通讯录系统课程设计

    这篇文章主要为大家详细介绍了C语言链表实现通讯录系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 详解C++中的vector容器及用迭代器访问vector的方法

    详解C++中的vector容器及用迭代器访问vector的方法

    使用迭代器iterator可以更方便地解引用和访问成员,当然也包括vector中的元素,本文就来详解C++中的vector容器及用迭代器访问vector的方法,需要的朋友可以参考下
    2016-05-05
  • Windows平台下配置VS Code的C++环境教程

    Windows平台下配置VS Code的C++环境教程

    这篇文章主要介绍了Windows平台下配置VS Code的C++环境教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C++ map与set封装实现过程讲解

    C++ map与set封装实现过程讲解

    set set是一种关联式容器,下面这篇文章主要给大家介绍了关于C++中map和set使用的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03

最新评论