各种排序

来源:互联网 发布:那个软件可以制作菜单 编辑:程序博客网 时间:2024/05/16 05:46


#if 1
#include <malloc.h>
#include <stdio.h>
//直接插入
void InsertSort(int *a,int len)
{
 int i,j,temp,k;
  for(i=1;i<len;i++)
  {
      k = a[i];
   for(j=i-1;j>=0;j--)
   {
      if(k<a[j])
   {
            //a[j]和a[j+1]交换
    temp = a[j+1];
    a[j+1] = a[j];
    a[j] = temp;
   }
   else
    break; 
   }
  }
}
//折半插入
void BInsertSort(int *a,int len)
{
 int i,k,j;
    for(i=1;i<len;i++)
 {
      k = a[i];
  int mid;
  int low = 0;
  int high = i-1;
  while(low<=high)
  {
             mid = (low+high)/2;
    if(k<a[mid])
                 high = mid-1;
    else
     low = mid+1;
  }
  for(j=i-1;j>=low;j--)
  {
   a[j+1] = a[j];
  }
  a[j+1] = k;
 }

}
//希尔排序
void shellSort(int *a,int len,int d)
{
 int i,j,k,temp;
 while(d>0)  //趟数
 {
  for(i=d;i<len;i++) //要插入的次数
  {
    k = a[i];
            for(j=i-d;j>=0;j-=d)
   {
    if(k<a[j])
    {
                  //a[j]和a[j+1]交换
         temp = a[j+d];
         a[j+d] = a[j];
         a[j] = temp;
    }
    else
     break;
   }
  }
  d--;
 }

}
//快排
void QSort(int *a,int low,int high)
{
 int i,j,temp,k;
 if(low<high)
 {
  i = low;
  j = high;
  k = a[i];
  while(i<j)
  {
   //已i端为支点
            if(a[i]<=a[j])
                j--;
   else
   {
               //交换
    temp = a[i];
    a[i]= a[j];
    a[j] = temp;
   }
   //以j端为支点
   if(a[i]<=a[j])
                 i++;
   else
   {
              //交换
    temp = a[i];
    a[i]= a[j];
    a[j] = temp;
   }
  }
  QSort(a,low,i-1);
  QSort(a,low+1,high);
 }
}
//选择
void SelectSort(int *a,int len)
{
 int i,j,min,temp;
 for(i=0;i<len-1;i++)  //控制趟数
 {
       min = i;
    //找最小值
    for(j=i;j<len;j++)
    {
          if(a[j]<a[min])
    {
            min = j;
    }
    }
    if(min!=i)
    {
     //交换
           temp = a[i];
     a[i] = a[min];
     a[min] = temp;
    }
 }

}
//调整堆
void HeapAdjust(int *a,int len)
{
 int i ;
 for(i=len/2-1;i>=0;i--)
 {
  int j = 2*i+1;    //左孩子
  int key = a[i];
  if(j+1<=len)   //有孩子
  {
   if(j+1<len)  //有右孩子
   {
    if(a[j]<a[j+1])
    {
     j = j+1; 
    }
   }
   if(a[j]>key)
   {
    //交换
    int temp= a[j];
    a[j] = key;
    a[i] = temp;
   }
   
  }
  
 } 
}
//堆排
void HeapSort(int *a,int len)
{
 int i;
 for(i=0;i<len-1;i++) //调整次数
 {
   HeapAdjust(a,len-i);
   int b = a[0];
   a[0] = a[len-i-1];
   a[len-i-1] = b;
 }
}
//合并
void Memge(int *a,int first,int mid,int last,int *temp)
{
 int i = first;
 int j = mid;
 int m = mid+1;
 int n = last;
 int k = 0;
 while(i<=j&&m<=n)
 {
  if(a[i]<a[m])
  {
   temp[k++] = a[i];
   i++;
   
  }
  else
  {
          temp[k++] = a[m];
    m++;
  }
 }
 while(i<=j)
 {
  temp[k++] = a[i];
  i++;
 }
 while(m<=n)
 {
  temp[k++] = a[m];
  m++;
 }
 for(i=0;i<k;i++)
 {
  a[first+i] = temp[i];
 }
}
//归并排序
void MSort(int *a,int first,int last,int *&temp)
{
 int mid;
 if(first<last)
 {
  mid = (first+last)/2;
  MSort(a,first,mid,temp);
  MSort(a,mid+1,last,temp);
        Memge(a,first,mid,last,temp);
 } 
}
void main()
{
 int i;
 int a[] = {49,38,65,97,76,13,69,49};
 int n = sizeof(a)/sizeof(a[0]);
   //InsertSort(a,n);
// BInsertSort(a,n);
// shellSort(a,n,3);
// QSort(a,0,n-1);
// SelectSort(a,n);
// HeapSort(a,n);
 int *temp = (int *)malloc(sizeof(int)*n);
 MSort(a,0,n-1,temp);
   for(i=0;i<n;i++)
   {
     printf("%d ",a[i]);
   }
}
#endif

0 0
原创粉丝点击