c语言实现几种排序算法rosylxf

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

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

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

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

快速排序据说是最快的。这个可以从思想上看的出来。,当记录较多的时候,快速排序的比较循环次数比上面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 1void 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>

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

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

冒泡排序

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

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

设想被排序的数组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的值,65>49,两者交换,此时:I=3 )

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

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

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

( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时: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} 完成排序。

THE END
0.C语言——十四种内部排序算法【插入排序希尔插入折半二分插入二路4.二路插入排序 算法演示 5.表插入排序 算法演示 二:选择排序 1.简单选择排序 算法演示 2.直接选择排序 算法演示 3.树形选择排序(锦标赛排序) 算法演示 4.堆排序 算法演示 三:交换排序 1.冒泡排序 算法演示 2.快速排序 算法演示 四:归并排序 算法演示 五:基数排序 1.多关键字的排序 高优先级排序MSD 低jvzquC41dnuh0lxfp0tfv8qkw3=35=5721gsvrhng1jfvjnnu1716;6987>
1.简单选择排序算法(C语言详解版)< 快速排序算法(QSort,快排) 树形选择排序(锦标赛排序)算法 > 该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上。例如对无序表{56,12,80,91,20}采用简单选择排序算法进行排序,具体过程为: jvzquC41yy}/zrsdcqqv0lto1cxdjr{g1f>bO}GvD0nuou
2.对成绩进行排序c语言c语言对学生成绩进行排序对成绩进行排序c语言_c语言对学生成绩进行排序 大家好,又见面了,我是你们的朋友全栈君。 解题思路: 注意事项:注意姓名字符串的长度要大于8,因为这个调了很多次 参考代码:#include #include #include using namespace std; struct student { int number;jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk04::864?
3.C语言排序方法(冒泡,选择,插入,归并,快速)C语言这篇文章给大家分享C语言所有经典排序方法,文章给大家提供完整的实例代码帮助大家快速学习掌握C语言排序方法,感兴趣的朋友一起看看吧它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该jvzquC41yy}/lk:30pku1jwvkerf1;6;747/j}r
4.排序算法详解2. 折半插入排序算法(C语言代码实现) 3. 2路插入排序算法详解 4. 表插入排序算法 5. 希尔排序算法(缩小增量排序)及C语言实现 6. 冒泡排序(起泡排序)算法及其C语言实现 7. 快速排序(QSort,快排)算法及C语言实现 8. 简单选择排序算法(C语言详解版) 9. 树形选择排序(锦标赛排序)算法详解 10. jvzquC41e0hjcwhjgpm/pny1fczba|ytwezvtn4uqtz0
5.tournamentsorttournamentgamesort本文深入探讨了锦标赛排序算法的原理、复杂度分析及具体实现步骤,包括如何利用完全二叉树构建排序过程,以及如何通过迭代和回溯完成整个排序流程。详细解释了时间复杂度和空间复杂度,并提供了C语言实现代码。 /* * szlTournamentSort.h */ #ifndefSZL_TOURNAMENT_H jvzquC41dnuh0lxfp0tfv8vkcprj|qnoc35bt}neng5eg}fknu594@:;35
6.C语言实现排名算法和排位算法书生侠客22{23inti, j;24intv;25//排序主体26for(i =0; i < l -1; i ++)27for(j = i+1; j < l; j ++)28{29if(a[i] > a[j])//如前面的比后面的大,则交换。30{31v =a[i];32a[i] =a[j];33a[j] =v;34}35}36}3738//排名39voidPaiMing(int*a,int*b,int*c,injvzquC41yy}/ewgnqiy/exr1jwgoi‚fpis{bp8u1:5?22B<0jvsm
7.C语言中的排序算法及其实现方法腾讯云开发者社区排序算法是计算机科学中的重要部分,它们在数据处理和算法设计中起着关键作用。在C语言编程开发中,掌握不同的排序算法及其实现方法对于提高代码质量和性能至关重要。本文将围绕C语言中的排序算法展开讨论,介绍几种常见的排序算法及其实现方法。 1C语言中的排序算法及其实现方法 jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk04<645;6
8.《数据结构(C语言版)第二版》第八章排序(8.3交换排序8.48.4.2 树形选择排序 / 锦标赛排序 8.4.3 堆排序 【基本思想】 是一种树形选择排序,利用大根堆(小根堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。① 将待排序的序列构造成一个大根堆,此时序列的最大值为根节点;② 依次将根节点与待排序序列的最后一jvzquC41dnuh0lxfp0tfv8vsa6:9:<7361gsvrhng1jfvjnnu1753B9:5;6
9.C语言中的八大排序算法详解C语言这篇文章主要介绍了C语言中的八大排序算法详解,所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,需要的朋友可以参考下+ 目录 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】 前言 所谓排序,就是使一串记录,按照其中的jvzquC41yy}/lk:30pku1ywqitgn1;>585=vs3jvo
10.C语言中的5种简单排序算法(适合小白)C语言本文主要介绍五种简单常用的排序算法:冒泡排序,快速排序,插入排序,选择排序,希尔排序。包括它们的基本思想和代码实现。值得一说的是:插入排序,冒泡排序,选择排序平均情况下的时间复杂度为,因此在排序数据较少的情况下较好;而希尔排序和快速排序的平均时间复杂度为,因此在排序数据较多的情况下较好,但是对于快速排序而言,jvzquC41yy}/lk:30pku1jwvkerf1;<;75:/j}r
11.C语言的冒泡算法与选择排序首先定义一个数组,我定义是赋初值的,当然也可以循环输入,我的是降序排列。 一、冒泡排序 &nbs选择排序算法与冒泡排序算法 选择排序算法与冒泡排序算法 1. 选择排序算法(Selection Sort) 选择排序分为直接选择排序,树形选择排序(锦标赛排序)和堆排序。这里只介绍最简单的直接选择排序。 直接选择排序的算法思想jvzquC41eqjfnnffkpm/exr1ctzjeuj155<3:>56385
12.数据结构(C语言版)严蔚敏习题答案解析.pdf数据结构(C语言版)严蔚敏习题答案解析.pdf,数据结构(C语言版)严蔚敏习题答案解析 第一篇习题与学习指导 第0章 本篇提要与作业规范 一、本篇提要 本篇内容是按照作者编著的教科书《数据结构》(C语言版) 的内容和课程教学要求组 织的。各章均由基本内容、学习要点、算法演示jvzquC41oc~/dxtm33>/exr1jvsm1;5451722:4745:1296662722970ujzn
13.c++八大排序算法C/C++ 10种排序法 10种排序法(冒泡、选择、插入、希尔、归并、快速、堆、拓扑、基数、锦标赛排序) 立即下载 上传者: yxwanglh_yeah 时间: 2012-03-06 C++常见八大排序算法 我用vs2017写的包含八大排序算法和随机生成数的算法。其中包括:冒泡排序,快速排序,选择排序,插入排序,桶排序,希尔排序,计数排序jvzquC41yy}/k}j{g0ipo8wguq{sen4y:9;34=;7/;82:989