C语言8大经典排序方法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言8大经典排序方法

冒泡排序
main()
{
int i,j,temp;
int a[10];
for(i=0;i<10;i++)
scanf ("%d,",&a[i]);
for(j=0;j<=9;j++)
{ for (i=0;i<10-j;i++)
if (a[i]>a[i+1])
{ temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}
}
for(i=1;i<11;i++)
printf("%5d,",a[i] );
printf("\n");
}

选择排序
void sa(int array[],int n)
{
int i,j,k,temp;
for(i=0;i<10;i++){
k=i;
for(j=i+1;jif(array[j]k=j;
temp=array[k];
array[k]=array[i];
array[i]=temp;
}
}

直接插入排序
#include"stdio.h"
#define MAXSIZE 20
int Insertsort(int r[],int n)
{
int i,j;
for(i=2;i<=n;i++)
{ r[0]=r[i];j=i-1;
while(r[0]{ r[j+1]=r[j]; j--;
}
r[j+1]=r[0];
for(j=1;j<=n;j++)
{
printf("%d ",r[j]);
}
printf("\n");
}
}
int main()
{
int n,i;
int r[MAXSIZE];
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&r[i]);
Insertsort(r,n);
}

希尔排序
#include
void shell_sort(int arr[],int size)
{
int i,j,k,temp;
for(i=size/2;i>0;i/=2)
{
for(j=i;j{
temp=arr[j];
for(k=j-i;k>=0&&temp{
arr[k+i]=arr[k];
}
arr[k+i]=temp;
}
}
for(i=0;i{
printf("%d ",arr[i]);
}
}
void main()
{
int arr[]={12,34,64,23,87,54,89,45,56,1,3,7,5,4,2};
shell_sort(arr,15);
}

堆排序
#include
#include
#include
void sift(int *a,int k,int m)
{
int t;
t=a[k];
int i;
i=k;
int j;
j=2*i;
bool finished=false;
while(j<=m&&!finished)
{
if(jj=j+1;
if(t>a[j])
finished=true;
else
{
a[i]=a[j];
i=j;
j=2*i;
}
}
a[i]=t;
}
void createheap(int *a,int length)
{
int n=length;
for(int i=n/2;i>=1;--i)
{
sift(a,i,n);
}
}
void heapsort(int *a,int n)
{
createheap(a,n);
for(int i=n;i>=2;--i)
{
int x=a[1];
a[1]=a[i];
a[i]=x;
sift(a,1,i-1);
}
}
int main()
{
int *a;
a=new int[10];
srand(time(NULL));
int i;
printf("%s","随机数:");
for(i=1;i<=10;i++)
{
a[i]=rand();
printf("%d ",a[i]);
}
printf("\n");
heapsort(a,10);
printf("%s","排序后:");
for(i=1;i<=10;i++) printf("%d ",a[i]);
printf("\n");

}

归并排序
#include
#include
#include
void Merge(int *R,int low,int m,int high)
{
int i=low,j=m+1,p=0;
int *R1;
R1=(int *)malloc((high-low+1)*sizeof(int));
if(!R1)
return;
while(i<=m&&j<=high)
R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];
while(i<=m)
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 MergeSort(int R[],int low,int high)
{
int mid;
if(low{
mid=(low+high)/2;
MergeSort(R,low,mid);
MergeSort(R,mid+1,high);
Merge(R,low,mid,high);
}
}
int main(void)
{
int i;
int a[10]=;
int low=0,high=9;
srand( (unsigned int)time(NULL) );
for (i = 0; i < 10; i++)
{
a[i] = rand() % 100;
}
MergeSort(a,low,high);
for(i=low;i<=high;i++)
printf("%d ",a[i]);
return 0;
}

基数排序
#include
t

ypedef struct node {
int data;
int next;
} node;
int head;
int fr[10];
int re[10];
void Distribute(node *a, int w)
{
int i;
for (i=0; i<10; i++) {
fr[i] = -1;
}
for (i=head; i!=-1; i=a[i].next) {
int x = a[i].data / w % 10;
10=9(十位)
if (fr[x] == -1) {
fr[x] = re[x] = i;
}
else {
a[re[x]].next = i;
re[x] = i;
}
}
for (i=0; i<10; i++) {
if (fr[i] != -1) {
a[re[i]].next = -1;
}
}
}
void Collect(node *a)
{
int i, last;
last = -1;
for (i=0; i<10; i++) {
if (fr[i] != -1) {
if (last == -1) {
head = fr[i];
last = re[i];
}
else {
a[last].next = fr[i];
last = re[i];
}
}
}
a[last].next = -1;
}

void Out(node *a, int w)
{
int i, p, k;

printf("weight == %d\n", w);
for (i=0; i<10; i++) {
printf("fr[%d] ", i);
p = fr[i];
k = 0;
while (p != -1) {
printf("->%4d ", a[p].data);
p = a[p].next;
k++;
}
while (k<3) printf("-------"),k++;
printf("-> re[%d]\n", i);
}
}

void Output(node *a, int head)
{
while (head != -1) {
printf("%4d", a[head].data);
head = a[head].next;
}
printf("\n");
}

void main()
{
node a[10];
int i, n = 10, max;
max = 0x80000000;
printf("max == %d\n", max);
printf("Please intput %d numbers~\n", n);
for (i=0; iscanf("%d", &a[i].data);
a[i].next = i + 1;
if (a[i].data > max) max=a[i].data;
}
head = 0;
a[n - 1].next = -1;

Output(a, head);
for (i=1; i<=max; i*=10) {
Distribute(a, i);
Out(a, i);
Collect(a);
Output(a, head);
}
}

比较排序
#include
int main()
{
int a,b,c,*p1,*p2,*p3,*p;
printf("Please integer three numbers:\n");
scanf("%d%d%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
if(a{
p=p1;
p1=p2;
p2=p;
}
if(a{
p=p1;
p1=p3;
p3=p;
}
if(b{
p=p2;
p2=p3;
p3=p;
}
printf("由大到小排列是:\n");
printf("%d,%d,%d\n", *p1, *p2, *p3);
}

相关文档
最新文档