排序

来源:互联网 发布:java根据ip得到城市 编辑:程序博客网 时间:2024/05/01 17:30

归并排序:

 

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

void display(int d[],int n)
{
 int i;
 for(i=0;i<n;i++)
  printf("%d/t",d[i]);
 printf("/n");
}

void merge(int u[],int v[],int w[],int m,int n)
{
 int i,j,k;
 i=j=k=0;
 while(i<m&&j<n)
  if(u[i]<v[j])
   w[k++]=u[i++];
  else w[k++]=v[j++];
 while(i<m) w[k++]=u[i++];
 while(j<n) w[k++]=v[j++];
}

void merge_sort(int key[],int m)
{
 int j,k,pow,t[128];
 for(pow=1;pow<m;pow*=2)
  ;
 if(m<pow){
  printf("n wrong!/n");
  exit(1);
 }
 for(k=1;k<m;k*=2)
 {
  for(j=0;j<m-k;j+=2*k)
   merge(key+j,key+j+k,t+j,k,k);
  for(j=0;j<m;j++)
   key[j]=t[j];
  display(key,m);
 }
}

void main()
{
 int x[]={1,56,23,12,10,-23,78,25,68,85,0,53,64,97,298,123};
 int n;
 n=sizeof(x)/sizeof(int);
 printf("before sort.../n");
 display(x,n);
 printf("sorting.../n");
 merge_sort(x,n);
 printf("after sort.../n");
 display(x,n);
 getchar();
}

 

 

shell排序:

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

void shellsort(int a[],int n)
{
 int gap,i,j,temp;
 for(gap=n/2;gap>0;gap/=2)
 {
  for(i=gap;i<n;i++)
   for(j=i-gap;j>=0&&a[j]>a[j+gap];j-=gap)
   {
    temp=a[j];
    a[j]=a[j+gap];
    a[j+gap]=temp;
   }
 }
}

void main()
{
 int i;
 int a[10]={12,9,8,-2,0,56,2,89,13,55};
 shellsort(a,10);
 for(i=0;i<10;i++)
  printf("%d/t",a[i]);
 printf("/n");
 getchar();
}

 

 

quicksort:

 

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

int partition(int a[],int low,int high)
{
 int pivo=a[low];
 while(low<high){
  while(low<high&&a[high]>=pivo)
   --high;
  a[low]=a[high];
  while(low<high&&a[low]<pivo)
   ++low;
  a[high]=a[low];
 }
 a[low]=pivo;
 return low;
}

void qqsort(int a[],int low,int high)
{
 int pivo;
 if(low<high)
 {
  pivo=partition(a,low,high);
  qqsort(a,low,pivo-1);
  qqsort(a,pivo+1,high);
 }
}

void quicksort(int a[],int n)
{
 qqsort(a,0,n);
}

void main()
{
 int i;
 int a[11]={0,123,53,234,78,5,6,12,52,75,9};
 quicksort(a,10);
 for(i=0;i<11;i++)
  printf("%d/t",a[i]);
 printf("/n");
 getchar();
}




归并排序:

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


void display(int x[], int n)
{
int i;
for(i = 0; i < n; i++)
printf("%d\t", x[i]);
printf("\n");
}


void merge(int x[], int first, int mid, int last)
{
int j, k;
int begin1 = first;
int end1 = mid;
int begin2 = mid + 1;
int end2 = last;


int *tmp = (int *)malloc((last - first + 1) * sizeof(int));
for(k = 0; begin1 <= end1 && begin2 <= end2; k++) {
if(x[begin1] <= x[begin2])
tmp[k] = x[begin1++];
else 
tmp[k] = x[begin2++];
}


if(begin1 <= end1)
memcpy(tmp + k, x + begin1, (end1 - begin1 + 1) * sizeof(int));
if(begin2 <= end2)
memcpy(tmp + k, x + begin2, (end2 - begin2 + 1) * sizeof(int));


memcpy(x + first, tmp, (last - first + 1) * sizeof(int));
free(tmp);
}


void merge_sort(int x[], int first, int last)
{
int mid = 0;
if(first < last) {
mid = (first + last) / 2;
merge_sort(x, first, mid);
merge_sort(x, mid + 1, last);
merge(x, first, mid, last);
}
}


void main()
{
int x[] = {1,56,23,12,10,-23};
int n;
n = sizeof(x)/sizeof(int);
printf("before sort...\n");
display(x, n);
printf("sorting...\n");
merge_sort(x, 0, n - 1);
printf("after sort...\n");
display(x, n);
}


原创粉丝点击