简单的排序

#include<stdio.h>

#include<stdlib.h>

#define N 20

//冒泡排序
void bubble(int a[],int n)
{
  int j,i,temp;
 
  for (i = 0; i < n; i++)

 

    for (j =n-1; j > i; j--)

    {
      if (a[j] < a[j-1])

      {
         temp = a[j];

         a[j] = a[j-1];

         a[j-1] = temp;
      }
    }
}
//交换排序
void exchange(int a[],int n)
{
  int i,j,temp;

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

    for (j =i+1; j < n; j++)

    {
      if (a[i] > a[j])
 
      {
         temp = a[i];

         a[i] = a[j];

         a[j] = temp;
      }
    }
}
//选择排序
void selectsort(int a[],int n)
{
   int i,j,k,temp;

   for (i = 0; i <n; i++)
   {
     k = i;
 
     for (j = i+1; j < n; j++ )
 
     {
        if (a[i] > a[j])
           
            k = j;
     }
    
     if (k != i)
 
     {
        temp = a[i];

        a[i] = a[j];

        a[j] = temp;
     }
   }
}
//插入排序
void insert(int a[], int n)
{
  int i,j,temp;

  for (i = 1; i < n; i++)
  {
    j=i-1;
    
    temp = a[i];
 
    while (j >= 0 &&temp < a[j])

    {
       a[j+1] = a[j];
   
       j--;
    }

    a[j+1] = temp;
  }
}

//快速排序
void run(int a[],int left,int right)
{
  int i,j,temp,mid;

  i = left;

  j = right;

  mid = a[(left+right)/2];
 
  do{

    while (i < right &&a[i] < mid) //从左扫描大于中值的数

      i++;

    while (j > right &&a[j] > mid)//从右扫描小于中值的数

      j--;

    if (i <= j) //找到一对进行交换,并改变i , j
   
    {
       temp = a[i];

       a[i] = a[j];

       a[j] = temp;

       i++;

       j--;
    }

  }while (i<= j);//完成一次扫描

  if (left < j) //如果左部有值,递归扫描左部
 
  {
   run(a,left,j);
  }

  if (i <right)//如果右部有值,递归扫描右部

  {
   run(a,i,right);
  }
}

void quicksort(int a[],int n)
{
  run(a,0,n-1);
}
//希尔排序
void shell(int a[],int n)

{
  int step[4] = {9,5,3,1};

  int i,j,temp,k,s,w;

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

  {
    k =step[i];
   
  //  s = -k;

    for (j = k;j < n; j++)

    {
      temp = a[j];

      w = j-k;

   

      while (temp < a[w]&& w >= 0&& w <= n)

      {
         a[w+k] = a[w];
 
         w = w-k;
      }

      a[w+k] = temp;
    }
  }
}

void print(int a[],int n)
{
  int i;

  for (i = 0; i < n; i++)
    
   printf("%-5d",a[i]);
 
  printf("\n");
}
void main()
{
  int a[20],i;

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

    a[i] = rand()%100+1;
 
  print(a,N);

  printf("冒泡排序后\n");
 
  bubble(a,N);

  print(a,N);

  printf("重新初始化后的数据\n");

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

    a[i] = rand()%100+1;

  print(a,N);

  printf("交换排序后\n");

  exchange(a,N);

  print(a,N);

  printf("重新初始化后的数据\n");

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

    a[i] = rand()%100+1;

  print(a,N);

  printf("选择排序后\n");
 
  selectsort(a,N);

  print(a,N);

  printf("重新初始化后的数据\n");

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

    a[i] = rand()%100+1;

  print(a,N);

  printf("插入排序后\n");

  insert(a,N);

  print(a,N);

  printf("重新初始化后的数据\n");

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

    a[i] = rand()%100+1;

  print(a,N);

  printf("快速排序后\n");

  quicksort(a,N);

  print(a,N);

  printf("重新初始化后的数据\n");

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

    a[i] = rand()%100+1;

  print(a,N);

  printf("希尔排序后\n");

  shell(a,N);

  print(a,N);
}

虽然这几种是简单的排序,但是有时候还是会混淆,更复杂的排序算法,用到的时候再看,起码简单的要熟悉

posted on 2010-08-09 17:45  生活费  阅读(191)  评论(0编辑  收藏  举报

导航