小小陌上花开

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
#include<stdio.h>
/*
*交换类排序,每天一道算法题 
*按照从小到大的顺序进行排序 
* 毛施平
*/
//冒泡排序 
void traverseArray(int *p,int length)
{
   int i=0;
   for(;i<length;i++)
   {
     printf("%d\n",p[i]);
   } 

}
//这个是最简单的 
void bubbleSortOne(int *p,int length)
{
  int i=length;
  int j,temp;
  int lastChangeIndex;
  printf("简单一点:\n");
  while(i>1)
  {
   lastChangeIndex=1;
    for(j=0;j<i-1;j++)
    {
       if(p[j]>p[j+1])
       {
        temp=p[j];
        p[j]=p[j+1];
        p[j+1]=temp;
        lastChangeIndex=j;
       }
    }
   traverseArray(p,9);
   printf("\n");
   i=lastChangeIndex;
  } 
} 
//这个排序并不是最简单的 
void bubbleSort(int *p,int length)
{
  int i,j,temp;
  for(i=0;i<length;i++)
  {
    for(j=0;j<length-i-1;j++)
    {
       if(p[j]>p[j+1])
       {
        temp=p[j];
        p[j]=p[j+1];
        p[j+1]=temp;
       }
    } 
  }
} 
//快速排序 
int Partition(int *p,int low,int high)
{
  //int low=0,high=length-1;
  int temp=p[low];
  while(low<high)
  {
    while(low<high&&p[high]>=temp) high--;
       p[low]=p[high];
    while(low<high&&p[low]<=temp) low++;
       p[high]=p[low]; 
  }
  p[low]=temp;
  return low;
} 
void QSort(int *p,int low,int high)
{
  if(low<high)
  {
   int pivotloc=Partition(p,low,high);
   traverseArray(p,9);
   printf("\n"); 
   QSort(p,low,pivotloc-1);
   QSort(p,pivotloc+1,high);
  }


}

int main()
{
  int a[]={9,2,1,4,5,7,3,8,6}; 
  bubbleSortOne(a,sizeof(a)/sizeof(int));
  int low=0;
  int high=sizeof(a)/sizeof(int)-1; 
 // QSort(a,low,high);
  traverseArray(a,sizeof(a)/sizeof(int));
  
  system("pause");
  return 0;
}

冒泡排序和快速排序都属于交换类排序,最简单的冒泡排序需要考虑顺序基本确定以后,如果不需要调整的话,需要设置标志位,避免不进行交换的重复比较。冒泡排序如果正序,只需要比较n-1次,不需要移动,如果逆序的话,需要比较n(n-1)/2次,此时需要移动3n(n-1)/2次。

快速排序的排序思想是不停地确定中间的值,然后采用递归算法进行分别将两端进行排序。快速排序算法如果序列基本有序的话,快速排序退化成冒泡排序,算法时间复杂度O(n2)。如果不是基本有序的话,算法的时间复杂度为O(nlog(n)),其平均性能最好。递归使用的内存空间栈的大小最坏为O(n),可以通过比较,先快速排序较小的那部分,,则栈的最大深度可降为O(logn)。

 

posted on 2014-09-01 11:32  小小陌上花开  阅读(164)  评论(0编辑  收藏  举报