‘壹’ C语言中排序的算法是什么
冒泡排序,最简单的,就是如果你要把一个数列按从大到小排序,你就把最小的那个沉底。如果有N个数,则要进行N-1次比较,在第1趟要进行N-1次两两比较,在第J趟比较要进行N-J次两两比较。
‘贰’ c语言排序算法
#include<stdio.h>
#defineN100000//定义最多输入的数据
intsort(int*a,intn){
inti,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;
}
return0;
}
intmain(){
inta[N];
inti=0,n,ii;
while(1){
//printf("输入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(" ");
i=i+a[i]+1;
}
}
‘叁’ C语言如何从大到小排序呢
给你提供几个比较简单的算法思路。
首先纠正一下,你要排序的对象不要存在单个变量里,要存在数组里,这样才能用循环的方式取用。
插入排序
如果你打过牌,这种排序你就一定能理解。从未排序的部分取出一个元素来,然后插入到已经排好序的部分。就这样一个一个的查入。
2.选择排序
从未排序的部分选出最大(最小)的一个放在已排好序的部分的最后。然后重复此步骤。
3.归并排序
排一个很长的序列可能比较麻烦,我就把他们分成两份,把他们分别排好,然后再把他们接起来,接起来就很简单了。而这两个怎么排呢,我再把他们分别分成两个……这就要用到递归了。
总结一下,前两个时间复杂度是平方,后一个是n*logn 。还有很多其他排序方法,其中冒泡排序比较费时但是很好写,如果你不是想知其所以然,直接网络冒泡套用一下就行。
如果想系统的学习算法,推荐你读算法导论,就是那本很厚的。讲的很好。
‘肆’ C语言排序算法一共多少种
选择排序
#include<iostream>
usingnamespacestd;
voidselect_sort(intarr[],intnum);
voidoutput_array(intarr[],intnum);
intmain()
{
inta[10];
for(inti=0;i<10;i++)
{
cin>>a[i];
}
select_sort(a,10);
output_array(a,10);
return0;
}
voidselect_sort(intarray[],intn)//形参array是数组名
{
inti,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;
}
voidoutput_array(intarr[],intnum)
{
inti;
for(i=0;i<num;i++)
{
cout<<arr[i];
cout<<endl;
}
return;
}
2.冒泡排序
#include<stdio.h>
intmain()
{
inti,j,a[10],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]);
return0;
}
3.堆排序
#include<iostream>
usingnamespacestd;
voidpaii(inta[20],inti,intm)
{
intk,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;
}
elsebreak;
}
a[i]=t;
}
voidipai(inta[20],intn)
{
inti,k;
for(i=n/2-1;i>=0;i--)
paii(a,i,n);
for(i=n-1;i>=1;i--)
{
k=a[0];
a[0]=a[i];
a[i]=k;
paii(a,0,i);
}}
intmain()
{
inta[10],i;
for(i=0;i<10;i++)
cin>>a[i];
ipai(a,10);
for(i=0;i<10;i++)
cout<<a[i]<<endl;
}
4.快速排序
#include<iostream>
usingnamespacestd;
voidQuicksort(inta[],intlow,inthigh)
{
if(low>=high)
{
return;
}
intfirst=low;
intlast=high;
intkey=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);
}
intmain()
{
inti,a[100],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;
return0;
}
5. 基数排序
#include<stdio.h>
#include<stdlib.h>
intmain(){
intdata[10]={73,22,93,43,55,14,82,65,39,81};//对十个数进行排序
inttemp[10][10]={0};//构造一个临时二维数组,其值为0
intorder[10]={0};//构造一维数组,其值为0
inti,j,k,n,lsd;
k=0;n=1;
for(i=0;i<10;i++)printf("%d",data[i]);//在排序前,对这10个数打印一遍
putchar(' ');
while(n<=10){
for(i=0;i<10;i++){
lsd=((data[i]/n)%10);//lsd先对个位取余,然后再对十位取余,注意循环
temp[lsd][order[lsd]]=data[i];//temp[3][0]=73,temp[2][0]=22,temp[3][1]=93,temp[3][2]=43,⋯⋯
order[lsd]++;//需要区分的是lsd和order[lsd],这两个不是一样的概念嗷
}
printf(" 重新排列:");
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(' ');
printf(" 排序后:");
for(i=0;i<10;i++)printf("%d",data[i]);
return0;
}
6.希尔排序
#include<iostream>
usingnamespacestd;
voidshell_sort(inta[],intn);
intmain()
{
intn,a[10000];
cin>>n;
for(inty=0;y<n;y++)
cin>>a[y];
shell_sort(a,n);
for(inti=0;i<n;i++)
cout<<a[i]<<"";
cout<<endl;
}
voidshell_sort(inta[],intn)
{
intgap,k,temp;//定义增量;
for(gap=3;gap>0;gap--)//设置初始增量,递减;
{
for(inti=0;i<gap;i++)//按增量分组;
{
for(intj=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>
usingnamespacestd;
voidMergeSort(intp[],ints,intm,intt)
{
intq[100];//q[100]用来存放排好的序列
inti=s;
intj=m+1;
intk=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++];
elsewhile(j<=t)
q[k++]=p[j++];
for(intn=s;n<=t;n++)
p[n]=q[n];
}
voidMerge(intp[],ints,intt)
{
if(s<t)
{
intm=(s+t)/2;//将数组分成两半
Merge(p,s,m);//递归拆分左数组
Merge(p,m+1,t);//递归拆分右数组
MergeSort(p,s,m,t);//合并数组
}
}
intmain()
{
intn;
intp[100];
cin>>n;
for(inti=0;i<n;i++)
cin>>p[i];
Merge(p,0,n-1);
for(intj=0;j<n;j++)
cout<<p[j]<<"";
cout<<endl;
return0;
}
排序方法基本就这些,还有双向冒泡这种拓展的排序方法,还有直接排序如桶排序
‘伍’ C语言,快速排序算法
0和N-1表示的是数组下标。快排每一趟排序的目的是使值比设定的key值小的数都排到数组前部分,大的都排到后部分;然后对这两部分用新的关键值key分别重复上一步的操作;递归,直到数组有序。
其中关键值key=a[low]。
用题目给定的数组模拟第一趟排序如下:
下标0123456789
值91647824661232551
low=0high=9
part_element=a[low]=9
进入for循环
进入第一个while
part_element<51,于是high--,high=8;
part_element<25,high--,high=7;
part_element>3,不满足,结束while
a[low]=a[0]=a[high]=a[7]=3,low++,low=1;
进入第二个while
part_element<16,不满足,结束while
a[high]=a[7]=a[low]=a[1]=16,high--,high=6
for第一个循环结束,数组如下
316478246612162551
low=1,high=6
for第二个循环同上,结束时数组如下
344782476612162551
low=2,high=3
for第三个循环,第一个while中high--以后,low==high,直接break跳出for循环,此时
344782476612162551
low=2,high=2
结束for以后
a[high]=a[2]=part_element=9,得到
34982476612162551
split函数returnhigh=2
quicksort函数中middle=2;
下面两句递归,仍然是调用split函数,对数组
0-2,3-9两部分分别重复上述操作
最后直到数组数据有序
‘陆’ C语言排序方法中哪一种最方便
1.比较法2.选择排序3.冒泡排序4.希尔排序5.快速排序6.堆排序7.合并排序8.基数排序9.折半插入排序10.直接插入排序
‘柒’ c语言各种排序算法
1:桶排序;
2:堆排序;
3:冒泡排序;
4:快速排序
5:选择排序;
6:插入排序;
7:希尔排序;
8:归并排序;
9:基数排序;
10:计数排序;
‘捌’ C语言中的选择排序法是什么
选择排序(Selection sort)是一种简单直观的排序算法。工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
以下是一个实现选择排序的例子:
#defineSWAP(x,y,t)((t)=(x),(x)=(y),(y)=(t))
//将list中的n个数据,通过选择排序算法排序。
voidselete_sort(intlist[],intn)
{
inti,j,min,temp;
for(i=0;i<n-1;i++){
min=i;
for(j=i+1;j<n;j++)//找出最小元素的下标。
if(list[j]<list[min])
min=j;
SWAP(list[i],list[min],temp);//交换最小元素到当前起始位置。
}
}
‘玖’ 寻求c语言5种以上的简单的排序方法
//直接插入排序
voidStaInsertSort(inta[],intn)
{
inti,j,tmp;
for(i=1;i<n;++i)
{
tmp=a[i];
j=i-1;
while(j>=0&&tmp<a[j])
{
a[j+1]=a[j];
--j;
}
a[j+1]=tmp;
}
}
/*折半排序*/
voidMidSort(inta[],intn)
{
inti,j;
intlow,high,mid;
inttmp;
for(i=1;i<n;i++)
{
tmp=a[i];
low=0,high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]>tmp)
high=mid-1;
else
low=mid+1;
}
low=high,high=i;
while(high>low+1)
{
a[high]=a[high-1];
--high;
}
a[low+1]=tmp;
}
}
/*冒泡排序*/
voidMaoPaoSort(inta[],intn)
{
inti,j;
inttmp;
for(i=0;i<n-1;++i)
{
for(j=i+1;j<n;++j)
{
if(a[i]>a[j])
{
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
}
}
/*快速排序*/
voidQuickSort(inta[],intlow,inthigh)
{
inti,j;
inttmp;
if(low<high)
{
i=low,j=high;
tmp=a[low];
while(i<j)
{
while(i<j&&a[j]>=tmp)
--j;
a[i]=a[j];
while(i<j&&a[i]<=tmp)
++i;
a[j]=a[i];
}
a[i]=tmp;
QuickSort(a,low,i-1);
QuickSort(a,i+1,high);
}
}
/*选择排序*/
voidSelectSort(int*a,intn)
{
inti,j,k;
inttmp;
for(i=0;i<n-1;++i)
{
k=i;
for(j=i+1;j<n;++j)
if(a[k]>a[j])
k=j;
tmp=a[i];
a[i]=a[k];
a[k]=tmp;
}
}
/*堆排序*/
voidSift(inta[],intlow,inthigh)//堆调整函数
{
inti=low,j=2*i+1;
inttmp=a[i];
while(j<=high)
{
if(j<high&&a[j]<a[j+1])
++j;
if(tmp<a[j])
{
a[i]=a[j];
i=j;
j=2*i+1;
}
else
break;
}
a[i]=tmp;
}
voidHeapSort(inta[],intn)//堆排序函数
{
inti;
inttmp;
for(i=n/2-1;i>=0;--i)
Sift(a,i,n-1);
for(i=n-1;i>=1;--i)
{
tmp=a[0];
a[0]=a[i];
a[i]=tmp;
Sift(a,0,i-1);
}
}
‘拾’ C语言选择排序法
这是选择排序。先用a[0]与a[1]比较,当a[0]<a[1]时并不交换,而用k记下来现在a[0]最小……这样一趟比较完后a[k]就是整个数组中最小的元素,把它与a[0]交换;第二趟,从a[1]开始重复前面的操作,那么最后a[1]就是剩下的n-1个元素中最小的……看a[0]、a[1]已经由小到大排好了,当做完n-1趟时不就把整个数组都排好了吗?注意:t=array[k];array[k]=array[i];array[i]=t;不是for(j=i+1;j<n;j++)的循环体,要等它循环完了后才执行一次。