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++11就地初始化与列表初始化

    简述C++11就地初始化与列表初始化

    这篇文章主要介绍了C++11就地初始化与列表初始化的相关资料,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下
    2020-08-08
  • C语言中volatile关键字的深入讲解

    C语言中volatile关键字的深入讲解

    在程序设计中,尤其是在C语言、C++、C#和Java语言中,使用volatile关键字声明的变量或对象通常具有与优化、多线程相关的特殊属性,这篇文章主要给大家介绍了关于C语言volatile关键字的相关资料,需要的朋友可以参考下
    2021-07-07
  • VC创建DLL动态链接库的方法

    VC创建DLL动态链接库的方法

    这篇文章主要介绍了VC创建DLL动态链接库的方法,实例分析VC创建动态链接库的完整步骤,需要的朋友可以参考下
    2015-05-05
  • C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节

    本篇文章是对C语言中宏定义使用的小细节进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 深入c语言continue和break的区别详解

    深入c语言continue和break的区别详解

    本篇文章是对c语言中continue和break的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言实现快速排序算法实例

    C语言实现快速排序算法实例

    快速排序时间复杂度为O(nlogn),是数组相关的题目当中经常会用到的算法,下面这篇文章主要给大家介绍了关于C语言实现快速排序算法的相关资料,需要的朋友可以参考下
    2022-06-06
  • C++ namespace案例详解

    C++ namespace案例详解

    这篇文章主要介绍了C++ namespace案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Qt编程实现小时钟

    Qt编程实现小时钟

    这篇文章主要为大家详细介绍了Qt编程实现小时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C++虚函数及虚函数表简析

    C++虚函数及虚函数表简析

    这篇文章主要介绍了C++虚函数及虚函数表,内容非常详细,思路清晰,需要的朋友可以参考下
    2015-08-08
  • 二维指针动态分配内存连续问题深入分析

    二维指针动态分配内存连续问题深入分析

    当我们定义一个二维指针时,如果需要存储相应的数据,就需要我们动态的分配内存,这时,有一点是需要注意的,分配内存的方法不同,内存的连续性也是不相同的
    2013-07-07

最新评论