快速排序温习

#include <stdio.h>

void
printf_array(int *array,int len)
{
 int i=0;
 for(i =0;i<len;i++)
 {
  printf("%d ",*(array+i) );      
  //printf("%d ",array[i] );      
 }                 
 printf("\n");
                 
 void swap_array(int *array,int i,int k)
 {
  int temp = *(array+i);
  *(array+i) = *(array+k);
  *(array+k) = temp;
 }
 void InsertSort(int *array,int len)//O(n*n)
 {
   int i=0,j=0;
   int k = -1;   
   int temp=-1;
   for(i=1;i<len;i++)
   {
    k=i;
    temp = *(array+k);
    for(j=i-1;(j>=0)&&(*(array+j) > temp);j--)
    {
      *(array+j+1) = *(array+j);
      k = j;              
    }
    *(array+k) =temp;
   }
 }
 void SelectSort(int *array,int len)//O(n*n)
 {
   int i=0,j=0;
   int k = -1;
   for(i=0;i<len;i++)
   {
   k=i;
       for(j=i;j<len;j++)
       {
       if( *(array+j) < *(array+k) )
           k = j;          
       }
   swap_array(array,i,k);//找出最小的然后和有序的最后的替换 
   }   
   
 }
 void BubblSort(int *array,int len)
 {
  int i=0;
  int j=0;
  int exchange=1;
  for(i=0;i<len && exchange;i++)
  {
   exchange = 0;
   for(j=len-1;j>i;j--)    
   {         
   if(*(array+j-1) > *(array+j) )//如果有逆序,则交换,并记录 
    {
    swap_array(array,j-1,j);
    exchange = 1;
   
   }
   
 
  printf("exchange times %d\n",i);    
 }
 
  void ShellSort(int *array,int len)//O(n*n)
 {
   int i=0,j=0;
   int k = -1,gap;
   int temp =-1;
   
   gap = len;
   do
   {
       gap = gap/3+1;// 一般取的是3 
       for(i=gap;i<len;i+=gap)//当最终gap=1;就是插入排序了 
       {
       k=i;
       temp = *(array+k);
        for(j=i-gap;(j>=0)&&(*(array+j) > temp);j-=gap)
        {
          *(array+j+gap) = *(array+j);
          k = j;              
        }
        *(array+k) =temp;
       }
   }while(gap > 1);
 }
 int partition(int *array,int low,int high )
{
       int pv;
       pv = *(array+low);
       while(low < high)
       {
           //先从高的比较,这个 
           while((low<high) && (*(array+high) >= pv))//>=升序排序 
           {
            high--;
           }
           swap_array(array,low,high);  
           
           while((low <high) &&( *(array+low) <= pv ))
           {
            low++;           
           }
           swap_array(array,low,high);
          
       }
       return low;
}
 int count;
void QSort(int *array,int low,int high)
{

 if(low < high)
 {
  int pivot = partition(array,low,high);//每划分一次,就把该元素该留的位置确定了。 
  count++;
  printf("count is %d -->%d\n",count,pivot);
  QSort(array,low,pivot-1);
  QSort(array,pivot+1,high);
 }     
}
void QuickSort(int *array,int len)
{
 QSort(array,0,len-1);
}
int main(void )
{
 int array[]={21,25,49,25,16,8};
 int len = sizeof(array) / sizeof(*array);
 //SelectSort(&array[0],len);
 printf("%d\n",len);
 //InsertSort(array,len);
 //BubblSort(array,len);
 //ShellSort(array,len);
 QuickSort(array,len);
 printf_array(&array[0],len);    
 
 while(1);
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值