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语言排序算法一共多少种
选择排序
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.冒泡排序
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.快速排序
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.希尔排序
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.归并排序
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;
}
排序方法基本就这些,还有双向冒泡这种拓展的排序方法,还有直接排序如桶排序

更多文章:
begin和start的区别(start与begin的区别)
2026年10月15日 09:20
vant官网中文(范特365 是韩国化妆品VANT36.5吗)
2026年10月15日 09:10
prison break(越狱(prison break)到底是在讲个什么)
2026年10月15日 06:50
c程序设计第五版教学视频(求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!)
2026年10月15日 06:40
十六进制转二进制表(16进制转为2进制、8进制、10进制的公式)
2026年10月15日 06:10
programdata是什么文件(win7下ProgramData 文件夹是什么,里面的内容可以删吗)
2026年10月15日 04:50
502错误的网关(“502错误网关,服务器作为网关或代理,从上游服务器收到了无效的响应”怎么处理谁能帮我)
2026年10月15日 04:10





