`

自己写的 关于 C语言 “线性排序”问题

 
阅读更多
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int a[] = {4,5,4,1,4,90,5,50,70,1,20,50,65536,0,-3,-1,-4,-2,-6552,999};
	int max = 0, min = 0, i = 0,n = 0, *b = NULL, *c = NULL;
	
	for (i=0, n=sizeof(a)/sizeof(int); i<n; i++) if(a[i] >= max) max = a[i]+1;
	for (i=0, n=sizeof(a)/sizeof(int); i<n; i++) if(a[i] < 0 && a[i] < min) min = a[i];

	if ((b = (int *) calloc(max , sizeof(int))) == NULL) return 1;
	if (-min) if ((c = (int *) calloc(-min , sizeof(int))) == NULL) return 1;

	for (i=0, n=sizeof(a)/sizeof(int); i<n; i++) if(a[i]>=0) b[a[i]]++; else c[-a[i]]++;

	for (i=-min; i>0; i--) while (c[i]-- > 0) printf("%d\n",-i);
	for (i=0, n=max; i<n; i++) while (b[i]-- > 0) printf("%d\n",i);

	free(b); free(c); // release pointer
	b = NULL; c = NULL; // no wild pointer
	return 0;
}

 

运行:gcc c.c; ./a.out

输出:

-6552
-4
-3
-2
-1
0
1
1
4
4
4
5
5
20
50
50
70
90
999
65536

 

 

 

===========================华丽的分割线====================================

 

 

 

于 2012年2月20日更新:

#include <stdio.h>
#include <stdlib.h>

int *linear_sort(int *a, int n)
{
	int max = 0, min = 0, i = 0, j = 0, *b = NULL, *c = NULL, *r = NULL;
	
	for (i=0; i<n; i++) {
		if(a[i] >= max) max = a[i]+1;
		if(a[i] < 0 && a[i] < min) min = a[i];
	}

	if ((b = (int *) calloc(max , sizeof(int))) == NULL) exit(1);
	if (-min) if ((c = (int *) calloc(-min , sizeof(int))) == NULL) exit(1);
	if ((r = (int *) calloc(n , sizeof(int))) == NULL) exit(1);

	for (i=0; i<n; i++) if(a[i]>=0) b[a[i]]++; else c[-a[i]]++;

	for (i=-min; i>0; i--) while (c[i]-- > 0) r[j++] = -i;  
	for (i=0, n=max; i<n; i++) while (b[i]-- > 0) r[j++] = i; 


	free(b); free(c); // release pointer
	b = NULL; c = NULL; // no wild pointer
	return r;
}

int main()
{
	int a[] = {4,5,4,1,4,90,5,50,70,1,20,50,65536,0,-3,-1,-4,-2,-6552,999};
	int i = 0, n = sizeof(a)/sizeof(int);
	int *b = linear_sort(a, n);

	for (i=0; i<n; i++) {
		printf("%d\n",b[i]);
	}

	free(b); b = NULL; // release pointer
}

 

运行结果:

hu@xunleiman-desktop:~/tmp$ gcc t.c; ./a.out
-6552
-4
-3
-2
-1
0
1
1
4
4
4
5
5
20
50
50
70
90
999
65536

 

分享到:
评论

相关推荐

    基于C语言的排序方法汇总

    在C语言中,排序是数据处理的基本操作,用于将一组数据按照特定顺序排列。本文将详细介绍几种常见的排序算法,包括冒泡排序、梳排序、堆排序、归并排序、简单排序、快速排序、桶排序以及基数排序。我们将讨论每种...

    c语言算法集 插值法 非线性方程组 复数运算 极值问题 拟合与逼近 排序 数值积分 随机数产生 图形模式下读写屏幕 线性代数方程组

    本资源包集合了C语言实现的各种算法,涵盖了多个关键主题,包括插值法、非线性方程组求解、复数运算、极值问题、拟合与逼近、排序、数值积分、随机数生成以及图形模式下的屏幕读写和线性代数方程组解算。下面我们将...

    C语言的单词排序

    C语言标准库中没有内置的排序函数,但我们可以使用经典的排序算法,如冒泡排序、插入排序、选择排序,或者更高效的快速排序、归并排序等。这里推荐使用快速排序,因为它在大多数情况下表现出良好的性能。在排序过程...

    c语言拓扑排序(课表)

    在计算机科学领域,拓扑排序是一种对有向无环图(DAG,Directed Acyclic Graph)的线性排序,使得对于图中的每条有向边 (u, v),节点 u 都在节点 v 之前。这个概念常用于解决任务调度、资源分配、课程安排等问题。在...

    C语言 算法 排序 数据结构 哈希表等

    在"第六章 常见排序算法.ppt"中,你将了解到各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序等。这些排序算法各有优缺点,适用于不同的场景,理解它们的运作原理有助于提高编程能力。 数据结构...

    数据排序的几种方法(c语言实现)

    本文将深入探讨几种常见的排序算法,并以C语言为实现语言进行详细解释。C语言是一种强大的、低级的编程语言,适合理解算法的底层逻辑。 首先,我们来看冒泡排序。冒泡排序是最简单的排序算法之一,它通过不断交换...

    合并排序,插入排序,希尔排序,快速排序,冒泡排序,桶排序的C语言实现

    在编程领域,排序算法是数据结构与算法中的基础部分,对于C语言开发者来说,理解并实现这些算法至关重要。本文将详细讲解六种经典的排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并...

    C语言排序汇总

    以上就是"C语言排序程序汇总"涉及的主要知识点,学习和掌握这些排序算法有助于提升编程能力和解决实际问题的能力。通过阅读"C语言排序.txt"文件,你可以深入了解每种排序算法的实现细节和应用场景,并通过实践进一步...

    各种常用排序算法的C语言实现

    在编程领域,排序算法是计算机科学中的核心概念,它们用于组织和优化数据处理。C语言是一种广泛应用的编程...通过学习这些C语言实现,可以帮助开发者深入理解排序算法的工作原理,从而在实际问题中选择合适的排序方法。

    C语言实现拓扑排序 数据结构

    拓扑排序是对有向无环图(DAG,Directed Acyclic Graph)进行线性排序的一种方法,使得对于图中的每一条有向边uv(u指向v),节点u都在节点v之前。如果存在多种合法的排序,那么可以返回其中任意一种。 接下来,...

    八大排序算法C语言

    它在最好情况下(即输入已排序)达到线性时间复杂度O(n),但在最坏情况下也是O(n^2)。 4. **快速排序**:由C.A.R. Hoare提出的快速排序是基于分治策略的,通过选取一个“基准”元素,将数组分为两部分,一部分的...

    C语言常用排序方法大全

    在C语言中,常见排序算法的时间复杂度有O(n²),如冒泡排序、选择排序、插入排序,也有线性对数复杂度的算法,如快速排序、归并排序等。 空间复杂度则表示执行算法所需额外内存空间的大小。对于内排序算法,一般的...

    c语言的基本算法 数组排序

    如果要在已排序的数组中插入新的元素并保持排序不变,可以使用二分查找或直接线性搜索。二分查找效率更高,但需要数组已排序。找到合适的位置后,将后续元素依次向后移动一位,然后在空出的位置插入新元素。 数组...

    用C语言实现常用排序算法

    一、问题描述 本项目旨在实现并比较六...总结,这个项目提供了对C语言实现的排序算法的深入理解和实践,通过对各种排序方法的性能测试,我们可以更好地理解它们在不同场景下的适用性,并为实际问题选择合适的排序算法。

    c语言排序方法优缺点ppt

    **C语言排序方法详解及其优缺点** 在计算机科学中,排序是处理数据的重要步骤,它使得数据有序,便于检索和分析。C语言作为基础且强大的编程语言,提供了多种排序算法供程序员选择。以下是对几种常见C语言排序方法...

    c语言实现图的拓扑排序

    拓扑排序是对有向无环图(DAG,Directed Acyclic Graph)的一种线性排序,它使得对于图中的每一条有向边 (u, v),节点 u 的排序位置总是在节点 v 之前。在实际应用中,例如课程安排、项目依赖关系解决等场景,拓扑...

    数据结构-基于C语言实现线性顺序表的增删改查+排序,合表操作.rar

    本资料包提供了一个基于C语言实现线性顺序表的实例,包括增删改查以及排序和合表操作。 线性顺序表是一种特殊的数组,它的元素按线性顺序排列,可以通过下标访问任意位置的元素。在C语言中,我们通常使用一维数组来...

    C语言常用排序方法大全.rar

    "C语言常用排序方法大全.rar"这个压缩包文件很可能是为了收集并演示C语言中实现的各种排序算法。 1. **冒泡排序**: 冒泡排序是最基础的排序算法,通过不断地交换相邻两个元素的位置,使较大的元素逐渐“冒”到...

    C语言数组排序小结

    在探讨C语言数组排序方法的过程中,我们主要关注四种经典的排序算法:冒泡排序、选择排序、快速排序以及插入排序。这些排序算法不仅在C语言学习过程中占有重要地位,也是计算机科学基础理论的重要组成部分。 ### ...

Global site tag (gtag.js) - Google Analytics