热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

排序算法设计与实现c语言,C语言中的排序算法

本文目录一览:1、使用C语言编程实现排序算法2

本文目录一览:


  • 1、使用C语言编程实现排序算法


  • 2、C语言实现文件排序


  • 3、程序设计中有哪些排序算法?用C语言分别怎样实现?


  • 4、用C语言编程实现快速排序算法

使用C语言编程实现排序算法

#includestdio.h

main()

{

struct

{

char mz[5];

int sd;

char sbing[5];

int xs;

}a[100],k;

int i,b,j;

printf("请输入球员数量\n");

scanf("%d",b);

for(i=0;ib;i++)

{printf("请输入第%d个球员的信息\n",i+1);

printf("名字:"); scanf("%s",a[i].mz);

printf("速度(数字):"); scanf("%d",a[i].sd);

printf("伤病情况:"); scanf("%s",a[i].sbing);

printf("薪水(数字:"); scanf("%d",a[i].xs);}

for(j=0;jb;j++)

for(i=j+1;ib;i++)

if(a[j].sda[i].sd)

{ k=a[i];

a[i]=a[j];

a[j]=k;}

if(a[j].sd==a[i].sd)

if (a[j].xsa[i].xs)

{ k=a[i];

a[i]=a[j];

a[j]=k;}

for(j=0;jb;j++)

printf("名字:%s 速度: %d 伤病: %s 薪水: %d\n",a[j].mz,a[j].sd,a[j].sbing,a[j].xs);

}

如有不满请回复

C语言实现文件排序

常见排序算法(冒泡,选择,快速)的C语言实现

要实现这几种算法的关键是要熟悉算法的思想。简单的说,冒泡排序,就如名字说的,每经过一轮排序,将最大的数沉到最底部。选择排序的思想是将整个数列,分为有序区和无序区。每轮排序,将无序区里的最小数移入到有序区。快速排序的思想是以一个数为中心,通常这个数是该数列第一个数,将整个数列分为两个部分,一个部分是大于这个数的区域,一个部分是小于这个数的区域。然后再对这两个部分的数列分别排序。如果将数列分为两个部分是通过,一方面从后向前的搜索,另一方面从前向后的搜索来实现的。具体的参考后面的来自百度百科的文档。

从这几个简单的排序算法上看,有几个特点:

冒泡排序是最简单的,也是最稳定的算法。

选择排序不太稳定,但是效率上较冒泡还是有较大的提升。其实在分析的过程中就能发现,选择排序和冒泡排序相比,中间少了很多的交换过程,和比较的次数,这个应该是时间较少的原因。选择排序能够满足一般的使用。当比较的数超过以万为单位时,选择排序也还是要一点时间的。

快速排序据说是最快的。这个可以从思想上看的出来。,当记录较多的时候,快速排序的比较循环次数比上面2个都要少。但是在具体的实现过程中,并不见得如此。这是因为递归效率的低下导致的。当然,估计在实际使用过的过程,快速排序估计都会使用非递归操作栈的方式来实现。那样应该会效率高伤不少。估计我会在后期出一个快速排序的非递归实现来真正比较它们3个性能。在下面的程序中,可以通过调高N的数字就能看的出来冒泡排序和选择排序性能的差异。在N较小,大概几百的时候,是看不出来的。N较大的的时候,比如N=1000或者N=10000的时候,快速排序的递归实现就会卡死在那里了,出不了结果。

以下是具体的代码:

/*

** 常见排序算法比较

*/

#include stdio.h

#include stdlib.h

#include time.h

#include windows.h

#define N 10

#define Demo 1

void BubbleSort(int arr[], int n);

void SelectSort(int arr[], int n);

void QuickSort(int arr[], int n);

void PrintArray(int arr[], int n);

void GenerateArray(int arr[], int n);

int main(int argc, char *argv[])

{

int arr[N];

GenerateArray(arr, N);

#if Demo

printf("Before the bubble sort------------------------\n");

PrintArray(arr, N);

#endif

printf("Start Bubble sort----------------------\n");

clock_t start_time1=clock(); //开始计时

BubbleSort(arr, N);

clock_t end_time1=clock(); // 结束计时

printf("Running time is: %lf ms\n", (double)(end_time1-start_time1)/CLOCKS_PER_SEC*1000); //输出运行时间

#if Demo

printf("After the bubble sort------------------------\n");

PrintArray(arr, N);

#endif

printf("-----------------------------------------------------------\n");

sleep(1000); // 单位是毫秒即千分之一秒

GenerateArray(arr, N);

#if Demo

printf("Before the selection sort------------------------\n");

PrintArray(arr, N);

#endif

printf("Start selection sort----------------------\n");

clock_t start_time2=clock(); //开始计时

SelectSort(arr, N);

clock_t end_time2=clock(); // 结束计时

printf("Running time is: %lf ms\n", (double)(end_time2-start_time2)/CLOCKS_PER_SEC*1000); //输出运行时间

#if Demo

printf("After the selection sort------------------------\n");

PrintArray(arr, N);

#endif

printf("-----------------------------------------------------------\n");

sleep(1000); // 单位是毫秒即千分之一秒

GenerateArray(arr, N);

#if Demo

printf("Before the quick sort------------------------\n");

PrintArray(arr, N);

#endif

printf("Start quick sort----------------------\n");

clock_t start_time3=clock(); //开始计时

QuickSort(arr, N);

clock_t end_time3=clock(); // 结束计时

printf("Running time is: %lf ms\n", (double)(end_time3-start_time3)/CLOCKS_PER_SEC*1000); //输出运行时间

#if Demo

printf("After the quick sort------------------------\n");

PrintArray(arr, N);

#endif

system("PAUSE");

return 0;

}

// 产生随机列表

void GenerateArray(int arr[], int n)

{

int i;

srand((unsigned)time(0));

for(i = 0; i N; i++)

{

arr[i] = rand(); // 生成随机数 范围在0-32767之间

}

}

// 打印列表

void PrintArray(int arr[], int n)

{

int i = 0;

for(i = 0; i n; i++)

printf("%6d", arr[i]);

printf("\n");

}

// 经典冒泡排序

void BubbleSort(int arr[], int n)

{

int i = 0, j =0;

for(i = 0; i n; i++)

for(j = 0; j n - 1 - i; j++)

{

if(arr[j] arr[j + 1])

{

arr[j] = arr[j] ^ arr[j+1];

arr[j+1] = arr[j] ^ arr[j+1];

arr[j] = arr[j] ^ arr[j+1];

}

}

}

// 快速排序的递归实现

void QuickSort(int arr[], int n)

{

if(n = 1)

return;

int i =0 , j = n - 1;

int key = arr[0];

int index = 0;

while(i j)

{

// 从后向前搜索

while(j i arr[j] key)

j--;

if(j == i)

break;

else

{

//交换 a[j] a[i]

arr[j] = arr[j] ^arr[i];

arr[i] = arr[j] ^arr[i];

arr[j] = arr[j] ^arr[i];

index = j;

}

// 从前向后搜索

while(i j arr[i] key)

i++;

if(i == j)

break;

else

{

// 交换 a[i] a[j]

arr[j] = arr[j] ^arr[i];

arr[i] = arr[j] ^arr[i];

arr[j] = arr[j] ^arr[i];

index = i;

}

}

QuickSort(arr, index);

QuickSort(arr + index + 1, n - 1 - index);

}

// 选择排序

void SelectSort(int arr[], int n)

{

int i, j;

int min;

for(i = 0; i n - 1; i++)

{

int index = 0;

min = arr[i];

for(j = i + 1; j n; j++) //找出 i+1 - n 无序区的最小者与arr[i]交换

{

if(arr[j] min)

{

min = arr[j];

index = j;

}

}

if(index != 0) //表明无序区有比arr[i]小的元素

{

arr[i] = arr[i]^arr[index];

arr[index] = arr[i]^arr[index];

arr[i] = arr[i]^arr[index];

}

}

}

程序里有几点注意的地方:

一,在程序里,交换2个数,我使用了异或来处理。这个可以根据个人喜好。为了避免产生临时变量,可以使用如下几种方式来交换2个数:

a=a^b;

b=a^b;

a=a^b;

或者

a=a+b;

b=a-b;

a=a-b;

使用第二种也挺好的。第一种异或的方式,只适用于,2个数都为int型的,a,b可以正可以负,这个没有关系,但是必须是int类型。

二, sleep()函数是包含在windows.h里面的,要加入 #include window.h

三, 关于随机数生成的2个函数 srand()种子发生器函数,还有rand()随机数生成器函数,自己可以参考相关文档。

四, Demo宏来控制是演示还是比较性能用的。当把N调整的很小,比如10的时候,可以设置Demo为1,那样就能打印数组了,可以看到比较前后的情况。当把N调整到很大比如10000的时候,就把Demo设置为0,那样就不打印数组,直接比较性能。

具体的算法文档参考下面的:

冒泡排序

基本概念

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。

用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i, j的值依次为1,2,...10-i。

产生

在许多程序设计中,我们需要将一个数列进行排序,以方便统计,而冒泡排序一直由于其简洁的思想方法而倍受青睐。

排序过程

设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。

算法示例

A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]:

49 38 65 97 76 13 27

第一趟冒泡排序过程

38 49 65 97 76 13 27

38 49 65 97 76 13 27

38 49 65 97 76 13 27

38 49 65 76 97 13 27

38 49 65 76 13 97 27

38 49 65 76 13 27 97 – 这是第一趟冒泡排序完的结果

第二趟也是重复上面的过程,只不过不需要比较最后那个数97,因为它已经是最大的

38 49 65 13 27 76 97 – 这是结果

第三趟继续重复,但是不需要比较倒数2个数了

38 49 13 27 65 76 97

….

选择排序

基本思想

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序

在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

常见的选择排序细分为简单选择排序、树形选择排序(锦标赛排序)、堆排序。上述算法仅是简单选择排序的步骤。

排序过程

A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]:

49 38 65 97 76 13 27

第一趟排序后 13 [38 65 97 76 49 27]

第二趟排序后 13 27 [65 97 76 49 38]

第三趟排序后 13 27 38 [97 76 49 65]

第四趟排序后 13 27 38 49 [76 97 65]

第五趟排序后 13 27 38 49 65 [97 76]

第六趟排序后 13 27 38 49 65 76 [97]

最后排序结果 13 27 38 49 49 65 76 97

快速排序算法

算法过程

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:

1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;

2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];

3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值A[J],并与A[I]交换;

4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的A[I],与A[J]交换;

5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j+完成的最后另循环结束)

例如:待排序的数组A的值分别是:(初始关键数据:X=49) 注意关键X永远不变,永远是和X进行比较,无论在什么位子,最后的目的就是把X放在中间,小的放前面大的放后面。

A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]:

49 38 65 97 76 13 27

进行第一次交换后: 27 38 65 97 76 13 49

( 按照算法的第三步从后面开始找)

进行第二次交换后: 27 38 49 97 76 13 65

( 按照算法的第四步从前面开始找X的值,6549,两者交换,此时:I=3 )

进行第三次交换后: 27 38 13 97 76 49 65

( 按照算法的第五步将又一次执行算法的第三步从后开始找

进行第四次交换后: 27 38 13 49 76 97 65

( 按照算法的第四步从前面开始找大于X的值,9749,两者交换,此时:I=4,J=6 )

此时再执行第三步的时候就发现I=J,从而结束一趟快速排序,那么经过一趟快速排序之后的结果是:27 38 13 49 76 97 65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。

快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:

初始状态 {49 38 65 97 76 13 27}

进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65}

分别对前后两部分进行快速排序 {27 38 13} 经第三步和第四步交换后变成 {13 27 38} 完成排序。

{76 97 65} 经第三步和第四步交换后变成 {65 76 97} 完成排序。

程序设计中有哪些排序算法?用C语言分别怎样实现?

冒泡排序法,折半查找法。折半是有一定的顺序的中找,利用折半减少查找次数。

、没优化的冒泡我就不说了,优化的说是拿第一个元素跟后面的一个个比较,大的或小的放到第一个,这样第一次比较出来的就是最大的或最小的,然后第二个在跟后面的元素一个个比较,找出第二大或第二小,依此到完,用到二个FOR循环。

用C语言编程实现快速排序算法

给个快速排序你参考参考

/********************** 快速排序 ****************************

基本思想:在待排序的n个记录中任取一个记录(通常取第一个记录),

  以该记录为基准,将当前的无序区划分为左右两个较小的无

  序子区,使左边的记录均小于基准值,右边的记录均大于或

  等于基准值,基准值位于两个无序区的中间位置(即该记录

  最终的排序位置)。之后,分别对两个无序区进行上述的划

  分过程,直到无序区所有记录都排序完毕。

*************************************************************/

/*************************************************************

函数名称:static void swap(int *a, int *b)

参    数:int *a---整型指针

  int *b---整型指针

功    能:交换两个整数的位置

返 回 值:无

说    明:static关键字指明了该函数只能在本文件中使用

**************************************************************/

static void swap(int *a, int *b)

{  

    int temp = *a;

    *a = *b;

    *b = temp;

}

int quickSortNum = 0; // 快速排序算法所需的趟数

/*************************************************************

函数名称:static int partition(int a[], int low, int high)

参    数:int a[]---待排序的数据

  int low---无序区的下限值

  int high---无序区的上限值

功    能:完成一趟快速排序

返 回 值:基准值的最终排序位置

说    明:static关键字指明了该函数只能在本文件中使用

**************************************************************/

static int partition(int a[], int low, int high)

{

    int privotKey = a[low];  //基准元素

    while(low  high)

{   //从表的两端交替地向中间扫描  

        while(low  high   a[high] = privotKey)   // 找到第一个小于privotKey的值

high--;  //从high所指位置向前搜索,至多到low+1位置  

        swap(a[low], a[high]);  // 将比基准元素小的交换到低端

        while(low  high   a[low] = privotKey)   // 找到第一个大于privotKey的值

low++;  //从low所指位置向后搜索,至多到high-1位置

        swap(a[low], a[high]);  // 将比基准元素大的交换到高端

    }

quickSortNum++;  // 快速排序趟数加1

return low;  // 返回基准值所在的位置

}  

/*************************************************************

函数名称:void QuickSort(int a[], int low, int high)

参    数:int a[]---待排序的数据

  int low---无序区的下限值

  int high---无序区的上限值

功    能:完成快速排序算法,并将排序完成的数据存放在数组a中

返 回 值:无

说    明:使用递归方式完成

**************************************************************/

void QuickSort(int a[], int low, int high)

{  

    if(low  high)

{

        int privotLoc = partition(a, low, high); // 将表一分为二  

        QuickSort(a, low, privotLoc-1);          // 递归对低子表递归排序  

        QuickSort(a, privotLoc+1, high);         // 递归对高子表递归排序  

    }

}


推荐阅读
  • vue使用
    关键词: ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
author-avatar
想要铭记的总是轻易忘却-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有