當前位置:首頁 » 編程語言 » c語言排序演算法比較

c語言排序演算法比較

發布時間: 2022-04-01 05:30:47

c語言排序比較

#include<stdio.h>
#include<stdlib.h>
#include <math.h>
#define L 8 //排序元素個數
#define FALSE 0
#define TRUE 1

typedef struct
{
int key;
char otherinfo;
}RecType;

typedef RecType Seqlist[L+1];
int num; //定義排序趟數的全局變數
Seqlist R;
//直接插入排序
void Insertsort()
{
int i,j,k,m=0;
printf("\n\t\t原始數據為(按回車鍵開始排序):\n\t\t");
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
for(i=2;i<=L;i++)
{
if(R[i].key<R[i-1].key)
{
R[0]=R[i];
j=i-1;
while(R[0].key<R[j].key)
{
R[j+1]=R[j];
j--;
}
R[j+1]=R[0];
}
m++;
printf("\t\t第%d趟排序結果為(按回車鍵繼續):\n\t\t",m);
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
}
printf("\n\t\t排序的最終結果是:\n\t\t");
for(i=1;i<=L;i++)
{
printf("%5d",R[i].key);
}
printf("\n");
}
//希爾排序
void Shellsort()
{
int i,j,gap,x,m=0,k;
printf("\n\t\t原始數據為(按回車鍵開始排序):\n\t\t");
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
gap=L/2;
while(gap>0)
{
for(i=gap+1;i<=L;i++)
{
j=i-gap;
while(j>0)
{
if(R[j].key>R[j+gap].key)
{
x=R[j].key;
R[j].key=R[j+gap].key;
R[j+gap].key=x;
j=j-gap;
}
else
{
j=0;
}
}
}
gap=gap/2;
m++;
printf("\t\t第%d趟排序結果為(按回車鍵開始排序):\n\t\t",m);
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
}
printf("\n\t\t排序的最終結果是:\n\t\t");
for(i=1;i<=L;i++)
{
printf("%5d",R[i].key);
}
printf("\n");
}
//冒泡排序
void Bubblesort()
{
int i,j,k;
int exchange;
printf("\n\t\t原始數據為(按回車鍵開始排序):\n\t\t");
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
for(i=1;i<L;i++)
{
exchange=FALSE;
for(j=L;j>=i+1;j--)
{
if(R[j].key<R[j-1].key)
{
R[0].key=R[j].key;
R[j].key=R[j-1].key;
R[j-1].key=R[0].key;
exchange=TRUE;
}
}
if(exchange)
{
printf("\t\t第%d趟排序結果為(按回車鍵開始排序):\n\t\t",i);
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
}
}
printf("\n\t\t排序的最終結果是:\n\t\t");
for(i=1;i<=L;i++)
{
printf("%5d",R[i].key);
}
printf("\n");
}

int Partition(int i,int j) //i和j為形式參數,分別代表low和high
{
RecType pirot=R[i];
while(i<j)
{
while(i<j&&R[j].key>=pirot.key)
{
j--;
}
if(i<j)
{
R[i++]=R[j];
}
while(i<j&&R[j].key<=pirot.key)
{
i++;
}
if(i<j)
{
R[j--]=R[i];
}
}
R[i]=pirot;
return i;
}
//遞歸形式為快速排序
void Quicksort(int low,int high)
{
int pirotpos,k;
if(low<high)
{
pirotpos=Partition(low,high);
num++;
printf("\t\t第%d趟排序結果為(按回車鍵開始排序):\n\t\t",num);
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
Quicksort(low,pirotpos-1);
Quicksort(pirotpos+1,high);
}
}
//選擇排序
void Selectsort()
{
int i,j,k,h;
printf("\n\t\t原始數據為(按回車鍵開始排序):\n\t\t");
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
for(i=1;i<L;i++)
{
h=i;
for(j=i+1;j<=L;j++)
{
if(R[j].key<R[h].key)
{
h=j;
}
}
if(h!=j)
{
R[0]=R[i];
R[i]=R[h];
R[h]=R[0];
}
printf("\t\t第%d趟排序結果為(按回車鍵開始排序):\n\t\t",i);
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
}
printf("\n\t\t排序的最終結果是:\n\t\t");
for(i=1;i<=L;i++)
{
printf("%5d",R[i].key);
}
printf("\n");
}

void Merge(int low,int mm,int high)
{
int i=low,j=mm+1,p=0;
RecType *R1;
R1=new RecType[high-low+1];
if(!R1)
{
printf("內存容量不夠!");
}
while(i<=mm&&j<=high)
{
R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++];
}
while(i<=mm)
{
R1[p++]=R[i++];
}
while(j<=high)
{
R1[p++]=R[j++];
}
for(p=0,i=low;i<=high;p++,i++)
{
R[i]=R1[p];
}
}

void MergePass(int length)
{
int i;
for(i=1;i+2*length-1<=L;i=i+2*length)
{
Merge(i,i+length-1,i+2*length-1);
}
if(i+length-1<L)
{
Merge(i,i+length-1,L);
}
}
//歸並排序
void Mergesort()
{
int length,k,m=0,i;
printf("\n\t\t原始數據為(按回車鍵開始排序):\n\t\t");
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
for(length=1;length<L;length*=2)
{
MergePass(length);
m++;
printf("\t\t第%d趟排序結果為(按回車鍵開始排序):\n\t\t",m);
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
}
printf("\n\t\t排序的最終結果是:\n\t\t");
for(i=1;i<=L;i++)
{
printf("%5d",R[i].key);
}
printf("\n");
}
//堆建
void CreateHeap(int root,int index)
{
int j,temp,finish;
j=2*root;
temp=R[root].key;
finish=0;
while(j<=index&&finish==0)
{
if(j<index)
{
if(R[j].key<R[j+1].key)
{
j++;
}
}
if(temp>=R[j].key)
{
finish=1;
}
else
{
R[j/2].key=R[j].key;
j=j*2;
}
}
R[j/2].key=temp;
}//堆排序
void Heapsort()
{
int i,j,temp,k;
for(i=(L/2);i>=1;i--)
{
CreateHeap(i,L);
}
for(i=L-1,k=1;i>=1;i--,k++)
{
temp=R[i+1].key;
R[i+1].key=R[1].key;
R[1].key=temp;
CreateHeap(1,i);
printf("\t\t第%d趟排序結果為(按回車鍵開始排序):\n\t\t",k);
for(j=1;j<=L;j++)
{
printf("%5d",R[j].key);
}
getchar();
printf("\n");
}
}
void Heap()
{
int i;
printf("\n\t\t原始數據為(按回車鍵開始排序):\n\t\t");
for(i=1;i<=L;i++)
{
printf("%5d",R[i].key);
}
getchar();
printf("\n");
Heapsort();
printf("\n\t\t排序的最終結果是:\n\t\t");
for(i=1;i<=L;i++)
{
printf("%5d",R[i].key);
}
printf("\n");
}

main()
{
Seqlist S;
int i,k;
char ch1,ch2,q;
printf("\n\t\t請輸入%d個待排序數據(按回車鍵分隔):\n\t\t",L);
for(i=1;i<=L;i++)
{
scanf("%d",&S[i].key);
getchar();
printf("\t\t");
}
printf("\n\t\t排序數據已經輸入完畢!");
ch1='y';
while(ch1=='y'||ch1=='Y')
{
printf("\n");
printf("\n\t\t 排 序 子 系 統 \n");
printf("\n\t\t*******************************************\n");
printf("\n\t\t* 1--------更新排序數據 *\n");
printf("\n\t\t* 2--------直接插入排序 *\n");
printf("\n\t\t* 3--------希 爾 排 序 *\n");
printf("\n\t\t* 4--------冒 泡 排 序 *\n");
printf("\n\t\t* 5--------快 速 排 序 *\n");
printf("\n\t\t* 6--------選 擇 排 序 *\n");
printf("\n\t\t* 7--------歸 並 排 序 *\n");
printf("\n\t\t* 8--------堆 排 序 *\n");
printf("\n\t\t* 0--------返 回 *\n");
printf("\n\t\t*******************************************\n");
printf("\n\t\t 請選擇菜單號(0--8):");
scanf("%c",&ch2);
getchar();
for(i=1;i<=L;i++)
{
R[i].key=S[i].key;
}
switch(ch2)
{
case '1':
printf("\n\t\t請輸入%d個待排序數據(按回車鍵分隔):\n\t\t",L);
for(i=1;i<=L;i++)
{
scanf("%d",&S[i].key);
getchar();
printf("\t\t");
}
printf("\n\t\t排序數據已經輸入完畢!");
break;
case '2':
Insertsort();
break;
case '3':
Shellsort();
break;
case '4':
Bubblesort();
break;
case '5':
printf("\n\t\t原始數據為(按回車鍵開始排序):\n\t\t");
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
getchar();
printf("\n");
num=0;
Quicksort(1,L);
printf("\n\t\t排序的最終結果是:\n\t\t");
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
printf("\n");
break;
case '6':
Selectsort();
break;
case '7':
Mergesort();
break;
case '8':
Heap();
break;
case '0':
ch1='n';
break;
default:
system("cls");
printf("\n\t\t 對不起,您的輸入有誤,請重新輸入!\n");
break;
}
if(ch2!='0')
{
if(ch2=='2'||ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch2=='8')
{
printf("\n\n\t\t排序輸出完畢!");
printf("\n\t\t按回車鍵返回。");
q=getchar();
if(q!='\xA')
{
getchar();
ch1='n';
}
}
}
}
}

沒有錯啊!我剛才試了一下,沒有錯!你把工程命名的後綴名為.cpp就可以了。

❷ C語言編寫代碼實現幾種內部排序演算法的性能比較,有償求代碼和簡要的實驗報告。

http://wenku..com/view/6ff074740912a216147929db.html

可以參考這個

部分代碼,使用了模板,其他演算法自己弄把,輸出的數據弄幾個表格就是結果了

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

voidtestSort(intlen);
intmain(intargc,char*argv[])
{
testSort(10000);
testSort(20000);
testSort(40000);
testSort(80000);
testSort(160000);
testSort(320000);
testSort(640000);
testSort(1280000);
testSort(2560000);
testSort(5120000);
testSort(10240000);

return0;
}

#defineCOUNT_SETVAL//測試消耗時間注釋掉這兩句
#defineCOUNT_COMPARE

#ifdefCOUNT_SETVAL
__int64gSetValTimes;
#endif
#ifdefCOUNT_COMPARE
__int64gCompareTimes;
#endif

//交換
template<classT>
inlinevoidswap(T&_X,T&_Y)
{
T_T=_X;
_X=_Y;
_Y=_T;
#ifdefCOUNT_SWAP
gSwapTimes++;
#endif
#ifdefCOUNT_SETVAL
gSetValTimes+=3;
#endif
}
//復制
template<classT>
inlinevoidsetVal(T&_X,T&_Y)
{
_X=_Y;
#ifdefCOUNT_SETVAL
gSetValTimes++;
#endif
}
//比較
template<classT>
inlineintcompare(T&_X,T&_Y)
{
#ifdefCOUNT_COMPARE
gCompareTimes++;
#endif
return_X<_Y;
}

//堆排序
template<classT,classS>
voidheap_sort(T*_A,S_N)
{
Stop,bot,nxt,cur;
top=bot=nxt=_N;
while(cur=nxt,bot>0)
{
if(cur*2+1<bot&&compare(_A[nxt],_A[cur*2+1]))nxt=cur*2+1;
if(cur*2+2<bot&&compare(_A[nxt],_A[cur*2+2]))nxt=cur*2+2;
if(cur<nxt)swap(_A[cur],_A[nxt]);
elsenxt=top?--top:(swap(_A[0],_A[--bot]),0);
}
}

//原地合並排序
template<classT,classS>
voidncmerge_sort(T*_A,S_N)
{
Sstep,ins,l,m,r,pos0,pos1;
T*_T=newT[_N];

for(step=2;step<_N*2;step*=2)
{
for(l=0;l+step/2<_N;l+=step)
{
m=l+step/2;
r=m+step/2<_N?m+step/2:_N;
pos0=l;pos1=m;ins=0;
while(pos0<m&&pos1<r)
{
if(compare(_A[pos1],_A[pos0]))setVal(_T[ins++],_A[pos1++]);
elsesetVal(_T[ins++],_A[pos0++]);
}
while(pos0<m)setVal(_T[ins++],_A[pos0++]);
while(pos1<r)setVal(_T[ins++],_A[pos1++]);
while(ins>0)setVal(_A[--r],_T[--ins]);
}
}
delete[]_T;
}

//冒泡排序
template<classT,classS>
voidbubble_sort(T*_A,S_N)
{
Si,j,pos;
for(i=0;i<_N;i++)
{
pos=i;
for(j=i+1;j<_N;j++)if(compare(_A[j],_A[pos]))pos=j;
if(pos!=i)swap(_A[i],_A[pos]);
}
}

//快速排序
template<classT,classS>
voidquick_sort(T*_A,S_N)
{
Tpivot;
Sl=0;
Sm=_N/2;
Sr=_N-1;
if(_N>1)
{
if(compare(_A[r],_A[l]))swap(_A[l],_A[r]);
if(compare(_A[m],_A[l]))swap(_A[l],_A[m]);
if(compare(_A[r],_A[m]))swap(_A[m],_A[r]);
setVal(pivot,_A[m]);
while(l<=r)
{
while(compare(_A[l],pivot))l++;
while(compare(pivot,_A[r]))r--;
if(l<=r)swap(_A[l++],_A[r--]);
}
quick_sort(_A,r+1);
quick_sort(_A+l,_N-l);
}
return;
}

template<classT,classS>
voidheap2_sort(T*_A,S_N)
{
Ttempitem;
Scurrent,next;
Stop=_N/2;
while(_N>0)
{
if(top>0)top-=1;elseswap(_A[--_N],_A[0]);
setVal(tempitem,_A[top]);
current=top;
while(1)
{
next=current*2+1;
if(next+1<_N&&compare(_A[next],_A[next+1]))
{
next+=1;
}
if(next<_N)
{
setVal(_A[current],_A[next]);
current=next;
}
elsebreak;
}
while(next>0)
{
next=(current-1)/2;
if(next>=top&&compare(_A[next],tempitem))
{
setVal(_A[current],_A[next]);
current=next;
}
elsebreak;
}
setVal(_A[current],tempitem);
}
}

template<classT,classS>
voidcomb_sort(T*_A,S_N)
{
Snoswap=1;
Sdelta=_N;
Si;
while(!noswap||delta>1)
{
if(delta>1)
{
delta=(S)(delta/1.25);
}
for(noswap=1,i=0;i+delta<_N;i++)
{
if(compare(_A[i+delta],_A[i]))
{
noswap=0;
swap(_A[i+delta],_A[i]);
}
}
}
return;
}

voidtestSort(intlen)
{
srand(time(NULL));
int*Array=newint[len];
for(inti=0;i<len;i++)Array[i]=rand();
#ifdefCOUNT_SETVAL
gSetValTimes=0;
#endif
#ifdefCOUNT_COMPARE
gCompareTimes=0;
#endif
clock_ttb=clock();
quick_sort(Array,len);
printf("quick:N=%d ",len);
#ifdefCOUNT_SETVAL
printf("復制:%I64d ",gSetValTimes);
#endif
#ifdefCOUNT_COMPARE
printf("比較:%I64d ",gCompareTimes);
#endif
printf("time:%ums ",clock()-tb); for(i=0;i<len;i++)Array[i]=rand();
#ifdefCOUNT_SETVAL
gSetValTimes=0;
#endif
#ifdefCOUNT_COMPARE
gCompareTimes=0;
#endif
tb=clock();
heap_sort(Array,len);
printf("heap:N=%d ",len);
#ifdefCOUNT_SETVAL
printf("復制:%I64d ",gSetValTimes);
#endif
#ifdefCOUNT_COMPARE
printf("比較:%I64d ",gCompareTimes);
#endif
printf("time:%ums ",clock()-tb); for(i=0;i<len;i++)Array[i]=rand();
#ifdefCOUNT_SETVAL
gSetValTimes=0;
#endif
#ifdefCOUNT_COMPARE
gCompareTimes=0;
#endif
tb=clock();
ncmerge_sort(Array,len);
printf("ncmerge:N=%d ",len);
#ifdefCOUNT_SETVAL
printf("復制:%I64d ",gSetValTimes);
#endif
#ifdefCOUNT_COMPARE
printf("比較:%I64d ",gCompareTimes);
#endif
printf("time:%ums ",clock()-tb); for(i=0;i<len;i++)Array[i]=rand();
#ifdefCOUNT_SETVAL
gSetValTimes=0;
#endif
#ifdefCOUNT_COMPARE
gCompareTimes=0;
#endif
tb=clock();
heap2_sort(Array,len);
printf("heap2:N=%d ",len);
#ifdefCOUNT_SETVAL
printf("復制:%I64d ",gSetValTimes);
#endif
#ifdefCOUNT_COMPARE
printf("比較:%I64d ",gCompareTimes);
#endif
printf("time:%ums ",clock()-tb);


for(i=0;i<len;i++)Array[i]=rand();
#ifdefCOUNT_SETVAL
gSetValTimes=0;
#endif
#ifdefCOUNT_COMPARE
gCompareTimes=0;
#endif
tb=clock();
comb_sort(Array,len);
printf("comb:N=%d ",len);
#ifdefCOUNT_SETVAL
printf("復制:%I64d ",gSetValTimes);
#endif
#ifdefCOUNT_COMPARE
printf("比較:%I64d ",gCompareTimes);
#endif
printf("time:%ums ",clock()-tb);
if(len<50000)
{
for(i=0;i<len;i++)Array[i]=rand();
#ifdefCOUNT_SETVAL
gSetValTimes=0;
#endif
#ifdefCOUNT_COMPARE
gCompareTimes=0;
#endif
tb=clock();
bubble_sort(Array,len);
printf("bubble:N=%d ",len);
#ifdefCOUNT_SETVAL
printf("復制:%I64d ",gSetValTimes);
#endif
#ifdefCOUNT_COMPARE
printf("比較:%I64d ",gCompareTimes);
#endif
printf("time:%ums ",clock()-tb);
}


printf(" ");
}

❸ C語言選擇法排序

#include<stdio.h>

#defineM 5

void main()

{

int b[M],i,j,t,k;

for(i=0;i<M;i++)

scanf("%d",&b[i]);

for(i=0;i<M-1;i++)

{

for(k=i,j=i+1;j<M;j++)

if(b[k]<b[j])

k=j;

if(i!=k)

{

t=b[i];

b[i]=b[k];

b[k]=t;

}

}

for(i=0;i<M;i++)

printf("%d ",b[i]);

}

錯在大括弧位置加錯了。

代碼:

#include<stdio.h>

void SelectionSort(int *num,int n)

{

int i = 0;

int min = 0;

int j = 0;

int tmp = 0;

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

{

min = i;//每次講min置成無序組起始位置元素下標

for(j = i;j < n;j++)//遍歷無序組,找到最小元素。

{

if(num[min]>num[j])

{

min = j;

}

}

if(min != i)//如果最小元素不是無序組起始位置元素,則與起始元素交換位置

{

tmp = num[min];

num[min] = num[i];

num[i] = tmp;

}

}

}

(此處空一行)

int main()

{

int num[6] = {5,4,3,2,9,1};

int i = 0;

SelectionSort(num,6);//這里需要將數列元素個數傳入。有心者可用sizeof在函數內求得元素個數。

for(i = 0;i < 6;i++)

{

printf("%d ",num[i]);

}

return 0;

}

❹ C語言排序演算法一共多少種

  1. 選擇排序

#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語言——實現各種排序演算法

剛做完的
#include <iostream>
using namespace std;

void BiInsertsort(int r[], int n) //插入排序(折半)
{
for(int i=2;i<=n;i++)
{
if (r[i]<r[i-1])
{
r[0] = r[i]; //設置哨兵
int low=1,high=i-1; //折半查找
while (low<=high)
{
int mid=(low+high)/2;
if (r[0]<r[mid]) high=mid-1;
else low = mid+1;
}
int j;
for (j=i-1;j>high;j--) r[j+1] = r[j]; //後移
r[j+1] = r[0];
}
}
for(int k=1;k<=n;k++) cout<<r[k]<<" ";
cout<<"\n";
}

void ShellSort ( int r[], int n) //希爾排序
{
for(int d=n/2;d>=1;d=d/2) //以d為增量進行直接插入排序
{
for (int i=d+1;i<=n;i++)
{
r[0] = r[i]; //暫存被插入記錄
int j;
for( j=i-d; j>0 && r[0]<r[j]; j=j-d) r[j+d] = r[j]; //記錄後移d個位置
r[j+d] = r[0];

}
}
for(int i=1;i<=n;i++) cout<<r[i]<<" ";
cout<<"\n";
}

void BubbleSort(int r[], int n) //起泡排序
{
int temp,exchange,bound;
exchange=n; //第一趟起泡排序的范圍是r[0]到r[n-1]
while (exchange) //僅當上一趟排序有記錄交換才進行本趟排序
{
bound=exchange;
exchange=0;
for (int j=1; j<bound; j++) //一趟起泡排序
if (r[j]>r[j+1])
{
temp=r[j];
r[j]=r[j+1];
r[j+1]=temp;
exchange=j; //記錄每一次發生記錄交換的位置
}
}
for(int i=1;i<=n;i++) cout<<r[i]<<" ";
cout<<"\n";
}

int Partition(int r[], int first, int end) //快速排序一次劃分
{
int i=first; //初始化
int j=end;
r[0]=r[first];
while (i<j)
{
while (i<j && r[0]<= r[j]) j--; //右側掃描
r[i]=r[j];
while (i<j && r[i]<= r[0]) i++; //左側掃描
r[j]=r[i];
}
r[i]=r[0];
return i; //i為軸值記錄的最終位置
}
void QuickSort(int r[], int first, int end) //快速排序
{
if (first<end)
{ //遞歸結束
int pivot=Partition(r, first, end); //一次劃分
QuickSort(r, first, pivot-1);//遞歸地對左側子序列進行快速排序
QuickSort(r, pivot+1, end); //遞歸地對右側子序列進行快速排序
}
}

void SelectSort(int r[ ], int n) //簡單選擇排序
{
int i,j,index,temp;
for (i=1; i<n; i++) //對n個記錄進行n-1趟簡單選擇排序
{
index=i;
for (j=i+1; j<=n; j++) //在無序區中選取最小記錄
if (r[j]<r[index]) index=j;
if (index!=i)
{
temp=r[i];
r[i]=r[index];
r[index]=temp;
}
}
for(i=1;i<=n;i++) cout<<r[i]<<" ";
cout<<"\n";
}

void main()
{
const int numv=12;
int a[3][numv]={{0,6,13,19,23,37,39,41,45,48,58,86},{0,86,58,48,45,41,39,37,23,19,13,6},{0,23,13,48,86,19,6,41,58,37,45,39}};
int z1[numv],z2[numv];
int m,n;
cout<<"請選擇測試數據類型:⑴正序 ⑵逆序 ⑶隨機 [ 若跳出,請按⑷ ]" <<endl;
cin>>m;
while(m>0&&m<4)
{
cout<<"請選擇排序演算法:⑴直接插入排序 ⑵希爾排序 ⑶冒泡排序 ⑷快速排序 \n ⑸簡單選擇排序"<<endl;
cin>>n;
switch(n)
{
case 1:
cout << "直接插入排序前:" << "\n";
for(int j=1;j<numv;j++) cout<<a[m-1][j]<<" ";
cout << "\n直接插入排序結果為:" << "\n";
BiInsertsort(a[m-1],numv-1);
break;
case 2:
cout << "\n希爾排序前:" << "\n";
for(int j=1;j<numv;j++) cout<<a[m-1][j]<<" ";
cout << "\n希爾排序結果為:" << "\n";
ShellSort(a[m-1], numv-1);
break;
case 3:
cout << "\n冒泡排序前:" << "\n";
for(int k=1;k<numv;k++) cout<<a[m-1][k]<<" ";
cout << "\n冒泡排序結果為:" << "\n";
BubbleSort(a[m-1], numv-1);
break;
case 4:
cout << "\n快速排序前:" << "\n";
for(int j=1;j<numv;j++) cout<<a[m-1][j]<<" ";
cout << "\n快速排序結果為:" << "\n";
QuickSort(a[m-1],0,numv-1);
for(int i=1;i<numv;i++)
cout<<a[m-1][i]<<" ";
cout<<"\n";
break;
case 5:
cout << "\n簡單選擇排序前:" << "\n";
for(int j=1;j<numv;j++) cout<<a[m-1][j]<<" ";
cout << "\n簡單選擇排序結果為:" << "\n";
SelectSort(a[m-1],numv-1);
break;

default:
cout<<"輸入錯誤!"<<endl;
}
m=0;
cout<<"請選擇測試數據類型:⑴正序 ⑵逆序 ⑶隨機 [ 若跳出,請按⑷ ]" <<endl;
cin>>m;
}
if(m==4) cout<<"(*^__^*) 再見!"<<endl;
else cout<<"輸入錯誤!"<<endl;
}

❻ 誰幫我寫一份c語言版的各種排序演算法的效率比較

(1)「冒泡法」 冒泡法大家都較熟悉。其原理為從a[0]開始,依次將其和後面的元素比較,若a[0]>a[i],則交換它們,一直比較到a[n]。同理對a[1],a[2],...a[n-1]處理,即完成排序。下面列出其代碼:void bubble(int *a,int n) /*定義兩個參數:數組首地址與數組大小*/ { int i,j,temp; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) /*注意循環的上下限*/ if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } 冒泡法原理簡單,但其缺點是交換次數多,效率低。 下面介紹一種源自冒泡法但更有效率的方法「選擇法」。 (2)「選擇法」 選擇法循環過程與冒泡法一致,它還定義了記號k=i,然後依次把a[k]同後面元素比較,若a[k]>a[j],則使k=j.最後看看k=i是否還成立,不成立則交換a[k],a[i],這樣就比冒泡法省下許多無用的交換,提高了效率。void choise(int *a,int n) { int i,j,k,temp; for(i=0;i<n-1;i++) { k=i; /*給記號賦值*/ for(j=i+1;j<n;j++) if(a[k]>a[j]) k=j; /*是k總是指向最小元素*/ if(i!=k) { /*當k!=i是才交換,否則a[i]即為最小*/ temp=a[i]; a[i]=a[k]; a[k]=temp; } } } 選擇法比冒泡法效率更高,但說到高效率,非「快速法」莫屬,現在就讓我們來了解它。 (3)「快速法」 快速法定義了三個參數,(數組首地址*a,要排序數組起始元素下標i,要排序數組結束元素下標j). 它首先選一個數組元素(一般為a[(i+j)/2],即中間元素)作為參照,把比它小的元素放到它的左邊,比它大的放在右邊。然後運用遞歸,在將它左,右兩個子數組排序,最後完成整個數組的排序。下面分析其代碼:void quick(int *a,int i,int j) { int m,n,temp; int k; m=i; n=j; k=a[(i+j)/2]; /*選取的參照*/ do { while(a[m]<k&&m<j) m++; /* 從左到右找比k大的元素*/ while(a[n]>k&&n>i) n--; /* 從右到左找比k小的元素*/ if(m<=n) { /*若找到且滿足條件,則交換*/ temp=a[m]; a[m]=a[n]; a[n]=temp; m++; n--; } }while(m<=n); if(m<j) quick(a,m,j); /*運用遞歸*/ if(n>i) quick(a,i,n); } (4)「插入法」 插入法是一種比較直觀的排序方法。它首先把數組頭兩個元素排好序,再依次把後面的元素插入適當的位置。把數組元素插完也就完成了排序。void insert(int *a,int n) { int i,j,temp; for(i=1;i<n;i++) { temp=a[i]; /*temp為要插入的元素*/ j=i-1; while(j>=0&&temp<a[j]) { /*從a[i-1]開始找比a[i]小的數,同時把數組元素向後移*/ a[j+1]=a[j]; j--; } a[j+1]=temp; /*插入*/ } } (5)「shell法」 shell法是一個叫 shell 的美國人與1969年發明的。它首先把相距k(k>=1)的那幾個元素排好序,再縮小k值(一般取其一半),再排序,直到k=1時完成排序。下面讓我們來分析其代碼:void shell(int *a,int n) { int i,j,k,x; k=n/2; /*間距值*/ while(k>=1) { for(i=k;i<n;i++) { x=a[i]; j=i-k; while(j>=0&&x<a[j]) { a[j+k]=a[j]; j-=k; } a[j+k]=x; } k/=2; /*縮小間距值*/ } } 上面我們已經對幾種排序法作了介紹,現在讓我們寫個主函數檢驗一下。 #include<stdio.h> /*別偷懶,下面的"..."代表函數體,自己加上去哦!*/ void bubble(int *a,int n) { ... } void choise(int *a,int n) { ... } void quick(int *a,int i,int j) { ... } void insert(int *a,int n) { ... } void shell(int *a,int n) { ... } /*為了列印方便,我們寫一個print吧。*/[code]void print(int *a,int n) { int i; for(i=0;i<n;i++) printf("%5d",a[i]); printf("\n"); } main() { /*為了公平,我們給每個函數定義一個相同數組*/ int a1[]={13,0,5,8,1,7,21,50,9,2}; int a2[]={13,0,5,8,1,7,21,50,9,2}; int a3[]={13,0,5,8,1,7,21,50,9,2}; int a4[]={13,0,5,8,1,7,21,50,9,2}; int a5[]={13,0,5,8,1,7,21,50,9,2}; printf("the original list:"); print(a1,10); printf("according to bubble:"); bubble(a1,10); print(a1,10); printf("according to choise:"); choise(a2,10); print(a2,10); printf("according to quick:"); quick(a3,0,9); print(a3,10); printf("according to insert:"); insert(a4,10); print(a4,10); printf("according to shell:"); shell(a5,10); print(a5,10); }

❼ C語言各種排序演算法比較次數和運行時間的計算,改如何寫,演算法我已經寫好了。

1. 比較次數,你加個變數比較一次統計一下不就可以了。

2. 統計運行時間

time_tbeg=clock();
InsertSort(...);
time_tend=clock();

printf("%lf ",(end-beg)/CLOCKS_PER_SEC);

應該是要加頭文件<time.h>

❽ 排序演算法性能比較(數據結構)C語言程序

這題你只要把每個演算法的程序代碼看一下,在計算下就行
冒泡排序:兩個循環,從1加到N,(1+N)N/2
=
500500,最壞交換情況是每次判斷都要交換,既500500*3次
選擇排序:也是兩個循環,比較次數跟冒泡排序一樣500500,但是這個只要底層循環交換,既只需1000*3
=
3000次賦值。
插入排序:循環次數一樣500500,但是這個最壞情況是每比較一次就賦值一次,既需500500次賦值
希爾排序:時間復雜度是N^1.3倍,比較次數和賦值應該是1000^1.3次方。
歸並排序和快速排序,你去查查它的時間復雜度是怎麼算,O(lgN*N),好像有系數,演算法導論那本書上有,現在不記得是多少了。
希望能幫到你,

❾ c語言排序演算法

對每一個國家名字字元串按字典序排序,從頭開始,比較每一個字母的大小,比如:
abc,
abd,
aaa,
bac,aaaa,5個國家,排序後
aaa,
aaaa,
abc,
abd,
bac

❿ C語言,排序演算法

對數組中的10個元數前幾個進行排序,安從小到大的順序。設n=5
如:10個元數是1,9,8,7,5
i=1時。temp=v[1]=9;j=0 v[j]=v[0]=1;不符合循環條件,不做;
i=2時。temp=v[2]=8;j=1 v[j]=v[1]=9;符合循環條件,做循環體;
v[1]=8;v[2]=9;這時數組為1,8,9,7,5
i=3時。temp=v[3]=7,j=2 v[j]=v[2]=9;符號循環條件。做循環體
v[1]=7,v[2]=8,v[3]=9。數組為1,7,8,9,5。
i=4時。做法是一樣的
最後結果為1,5,7,8,9
不知道對不對,我是這么認為的

熱點內容
點歌機怎麼選切換安卓系統 發布:2025-01-17 14:05:33 瀏覽:719
java壓縮與解壓縮 發布:2025-01-17 14:03:24 瀏覽:925
python代碼保護 發布:2025-01-17 14:02:22 瀏覽:323
王者榮耀電腦如何改戰區安卓 發布:2025-01-17 13:23:18 瀏覽:814
華為手機如何開啟說出密碼 發布:2025-01-17 13:23:12 瀏覽:101
伺服器在美國說明什麼 發布:2025-01-17 13:14:10 瀏覽:11
啟辰t90有哪些配置 發布:2025-01-17 13:05:40 瀏覽:38
手機微博密碼怎麼改密碼忘了怎麼辦 發布:2025-01-17 13:04:44 瀏覽:959
微笑雲伺服器 發布:2025-01-17 13:03:25 瀏覽:83
android頂部標題欄 發布:2025-01-17 13:02:28 瀏覽:692