c 排序算法(c语言排序算法)

:暂无数据 2026-09-20 08:00:02 :0

c  排序算法(c语言排序算法)

今天给各位分享c语言排序算法的知识,其中也会对c语言排序算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

c语言排序算法

#include 《stdio.h》
#define N 100000  //定义最多输入的数据 
int sort(int *a,int n){
int i,j,m;
for(i=0;i《n-1;i++)
for(j=i+1;j《n;j++)
if (a[i]》a[j]){
m=a[i];a[i]=a[j];a[j]=m;
}
return 0;
}
int main(){
int a[N];
int i=0,n,ii;
while(1){
//printf(“输入n\n“);
scanf(“%d“,&n);
a[i++]=n;
if (n==0) break;
ii=i;
for(;i《n+ii;i++)
scanf(“%d“,&a[i]);
}
i=0;
while(a[i]!=0){
sort(a+i+1,a[i]);
for(n=1;n《=a[i];n++)
printf(“%d “,a[i+n]);
printf(“\n“);
i=i+a[i]+1;
}
}

关于c语言几种排序方法的理解

关于对于 C 语言通常使用的几种排序算法(冒泡排序、堆排序、SHELL排序、快速排序、归并排序等)的深入理解:哪一个排序算法的执行效率最高、每一种排序算法所占用的系统空间、以及执行时间等,这个必须要通过学习计算机软件专业中的专业课程:计算机算法设计与分析,才能够做到这一点的。
否则的话,只能够按照数据结构(C语言版)中给出的 C 语言源代码进行普通的编程实现代码而已。而无法从计算机理论的角度上深入理解 C 语言中的几种排序算法。

C语言的快速排序的算法是什么啊

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 算法过程  设要排序的数组是A……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。   一趟快速排序的算法是:   1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;   2)以第一个数组元素作为关键数据,赋值给key,即 key=A;   3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值A[J],并与key交换;   4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的A[I],与key交换;   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 A A A A A A:   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} 完成排序。   

C语言排序算法一共多少种

  1. 选择排序

#include 《iostream》
using namespace std;
void select_sort(int arr, int num);
void output_array(int arr, int num);
int main()
{
    int a;
    for(int i=0; i《10; i++)
    {
        cin》》a[i];
    }
    select_sort(a,10);
    output_array(a,10);
    return 0;
}
void select_sort(int array,int n) //形参array是数组名
{
    int i,j,k,t;
    for(i=0; i《n-1; i++)
    {
        k=i;  //先设第i个就为最小
        for(j=i+1; j《n; j++)
            if(array[j]《array[k])
                k=j;   //通过循环,得到k为最小
        t=array[k];    //交换a[i]和a[k]
        array[k]=array[i];
        array[i]=t;
    }
    return;
}
void output_array(int arr, int num)
{
    int i;
    for(i=0; i《num; i++)
    {
        cout《《arr[i];
        cout《《endl;
    }
    return;
}

2.冒泡排序

#include《stdio.h》
int main()
{
int i,j,a,t;
for(i=0;i《10;i++)
scanf(“%d“,&a[i]);
for(i=0;i《10;i++)
for(j=i+1;j《10;j++)
if(a[i]》a[j])
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
for(i=0;i《10;i++)
printf(“%d “,a[i]);
return 0;
}

3.堆排序

#include《iostream》
using namespace std;
void  paidui(int a,int i,int m)
{
int k,t;    
t=a[i]; 
k=2*i+1;    
while (k《m)    
{        
if ((k《m-1)&&(a[k]《a[k+1])) 
k++;   
if (t《a[k]) 
{
a[i]=a[k]; 
i=k; 
k=2*i+1;
}        
else break; 
}    
a[i]=t;
}
void duipai(int a, int n)  
{
int i,k; 
for (i=n/2-1;i》=0;i--) 
paidui(a,i,n);     
for (i=n-1; i》=1; i--)    
{  
k=a; 
a=a[i]; 
a[i]=k;  
paidui(a,0,i);    
}}
int main() 
{  
int a,i; 
for(i=0;i《10;i++)  
cin》》a[i];
duipai(a,10); 
for(i=0;i《10;i++)
cout《《a[i]《《endl;
}

4.快速排序

#include《iostream》
using namespace std;
void Quicksort(int a,int low,int high)
{
    if(low》=high)
    {
        return;
    }
    int first=low;
    int last=high;
    int key=a[first];
    while(first《last)
    {
while(first《last&&a[last]》=key)
            --last;
        a[first]=a[last];
        while(first《last&&a[first]《=key)
            ++first;
        a[last]=a[first];
}
    a[first]=key;
    Quicksort(a,low,first-1);
    Quicksort(a,last+1,high);
}


int main()
{
    int i,a,x,n=0;
while(cin》》x)
{
a[n]=x;
n++;
}
n--;
Quicksort(a,0,n);
for(i=0;i《=n;i++)
cout《《a[i]《《“ “;
cout《《endl;
    return 0;
}

5. 基数排序

#include 《stdio.h》
#include 《stdlib.h》
int main(){
int data={73,22,93,43,55,14,82,65,39,81};        //对十个数进行排序
int temp={0};        //构造一个临时二维数组,其值为0
int order={0};        //构造一维数组,其值为0
int i,j,k,n,lsd;
k=0;n=1;
for (i=0;i《10;i++) printf(“%d “,data[i]);         //在排序前,对这10个数打印一遍
putchar(’\n’);
while (n《=10){
for (i=0;i《10;i++){
lsd=((data[i]/n)%10);         //lsd先对个位取余,然后再对十位取余,注意循环
temp[lsd][order[lsd]]=data[i];        //temp=73,temp=22,temp=93,temp=43,⋯⋯
order[lsd]++;        //需要区分的是lsd和order[lsd],这两个不是一样的概念嗷
}
printf(“\n重新排列: “);
for (i=0;i《10;i++){
if(order[i]!=0)
for (j=0;j《order[i];j++){


data[k]=temp[i][j];
printf(“%d “,data[k]);
k++;
}
order[i]=0;
}
n*=10; //第二次用十位
k=0;
}
putchar(’\n’);
printf(“\n排序后: “);
for (i=0;i《10;i++) printf(“%d “,data[i]);
return 0;
}

6.希尔排序

#include《iostream》
using namespace std;
void shell_sort(int a,int n);
int main()
{
    int n,a;
    cin》》n;
    for(int y=0;y《n;y++)
        cin》》a[y];
    shell_sort(a, n);
      for(int i=0; i《n; i++)
          cout《《a[i]《《“ “;
      cout《《endl;
}

void shell_sort(int a, int n)
{
    int gap,k,temp;//定义增量;
    for(gap = 3; gap 》0; gap--)//设置初始增量,递减;
    {
        for(int i=0; i《gap; i++)//按增量分组;
        {
            for(int j = i+gap; j《n; j=j+gap)//每组分别比较大小;
            {
                if(a[j]《a[j-gap])
                {
                    temp = a[j];
                    k = j-gap;
while(k》=0&&a[k]》temp)
                    {
                        a[k+gap] = a[k];
                        k = k-gap;
                    } 

                   a[k+gap] = temp;
                }
            }
        }
    }
}

7.归并排序

#include《iostream》
using namespace std;
void MergeSort(int p,int s,int m,int t)
{
     int q;                        //q用来存放排好的序列
 int i=s;
 int j=m+1;
 int k=s;
while(i《=m&&j《=t)
 {
 if(p[i]《=p[j])
 q[k++]=p[i++];
 else
 q[k++]=p[j++];
 }
 if(i《=m)
 while(i《=m)
 q[k++]=p[i++];
 else while(j《=t)
 q[k++]=p[j++];
 for(int n=s;n《=t;n++)
             p[n]=q[n];
}
 void Merge(int p,int s,int t)
 {
 if(s《t)
 {
 int m=(s+t)/2;  //将数组分成两半
 Merge(p,s,m);//递归拆分左数组
 Merge(p,m+1,t);//递归拆分右数组
 MergeSort(p,s,m,t);//合并数组
     }
 }
 int main()
 {
     int n;
 int p;
 cin》》n;
  for(int i=0; i《n; i++)
         cin》》p[i];
 Merge(p,0,n-1);
 for(int j=0;j《n;j++)
 cout《《p[j]《《“ “;
 cout《《endl;
 return 0;
 }

排序方法基本就这些,还有双向冒泡这种拓展的排序方法,还有直接排序如桶排序

以上就是我们为大家找到的有关“c 排序算法(c语言排序算法)”的所有内容了,希望可以帮助到你。如果对我们网站的其他内容感兴趣请持续关注本站。

c  排序算法(c语言排序算法)

本文编辑:admin

更多文章:


begin和start的区别(start与begin的区别)

begin和start的区别(start与begin的区别)

其实begin和start的区别的问题并不复杂,但是又很多的朋友都不太了解start与begin的区别,因此呢,今天小编就来为大家分享begin和start的区别的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月15日 09:20

vant官网中文(范特365 是韩国化妆品VANT36.5吗)

vant官网中文(范特365 是韩国化妆品VANT36.5吗)

大家好,今天小编来为大家解答以下的问题,关于vant官网中文,范特365 是韩国化妆品VANT36.5吗这个很多人还不知道,现在让我们一起来看看吧!

2026年10月15日 09:10

特殊字符是指什么?正则表达式中一些特殊字符的用法

特殊字符是指什么?正则表达式中一些特殊字符的用法

大家好,特殊字符相信很多的网友都不是很明白,包括特殊字符是指什么也是一样,不过没有关系,接下来就来为大家分享关于特殊字符和特殊字符是指什么的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

2026年10月15日 08:10

特殊符号网名大全花样符号(特殊符号昵称有哪些)

特殊符号网名大全花样符号(特殊符号昵称有哪些)

本篇文章给大家谈谈特殊符号网名大全花样符号,以及特殊符号昵称有哪些对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月15日 07:30

prison break(越狱(prison break)到底是在讲个什么)

prison break(越狱(prison break)到底是在讲个什么)

各位老铁们好,相信很多人对prison break都不是特别的了解,因此呢,今天就来为大家分享下关于prison break以及越狱(prison break)到底是在讲个什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看

2026年10月15日 06:50

c程序设计第五版教学视频(求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!)

c程序设计第五版教学视频(求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!)

各位老铁们,大家好,今天由我来为大家分享c程序设计第五版教学视频,以及求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动

2026年10月15日 06:40

电脑教程入门(电脑初学入门)

电脑教程入门(电脑初学入门)

本篇文章给大家谈谈电脑教程入门,以及电脑初学入门对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月15日 06:20

十六进制转二进制表(16进制转为2进制、8进制、10进制的公式)

十六进制转二进制表(16进制转为2进制、8进制、10进制的公式)

“十六进制转二进制表”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看十六进制转二进制表(16进制转为2进制、8进制、10进制的公式)!

2026年10月15日 06:10

programdata是什么文件(win7下ProgramData 文件夹是什么,里面的内容可以删吗)

programdata是什么文件(win7下ProgramData 文件夹是什么,里面的内容可以删吗)

本篇文章给大家谈谈programdata是什么文件,以及win7下ProgramData 文件夹是什么,里面的内容可以删吗对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题

2026年10月15日 04:50

502错误的网关(“502错误网关,服务器作为网关或代理,从上游服务器收到了无效的响应”怎么处理谁能帮我)

502错误的网关(“502错误网关,服务器作为网关或代理,从上游服务器收到了无效的响应”怎么处理谁能帮我)

大家好,今天小编来为大家解答以下的问题,关于502错误的网关,“502错误网关,服务器作为网关或代理,从上游服务器收到了无效的响应”怎么处理谁能帮我这个很多人还不知道,现在让我们一起来看看吧!

2026年10月15日 04:10

最近更新

免费网站做seo(个人网站如何做SEO)
2026-10-15 09:30:11 浏览:0
热门文章

标签列表