快速排序的原理及实际应用

      忙了几个小时,终于研究出来了自己的快速排序方法,先看具体原理。

      快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

      今天我结合以上概念并和具体题目联系起来学习了一下快速排序。

     题目:  现将举行一个餐会,让访客事先填写到达时间与离开时间,为了掌握座位的数目,必须先估计不同时间的最大访客数。
     解答:  用c++实现,代码如下:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define SWAP(x,y) {int t; t = x; x = y; y = t;}
int partition(int[], int, int);
void quicksort(int[], int, int); // 快速排序法
int maxguest(int[], int[], int, int);

int main(int argc, char* argv[])
{
 int x[MAX] = {0};
 int y[MAX] = {0};  
 int time = 0,temp; 
 int count = 0; 
 /*测试用
  int num1[]={12,5,36,59,3,2,57,66};

 
 printf("/n排序前:");
 for(temp=0;temp<8;temp++)
 {
  printf("%d ",num1[temp]);
 }
 quicksort(num1, 0, 8);
 printf("/n排序后:");
for(temp=0;temp<8;temp++)
 {
  printf("%d ",num1[temp]);
 }
*/

 printf("/n输入来访与离开125;时间(0~24):");  
 printf("/n范例:10 15");  
 printf("/n输入-1 -1结束");  
 while(count < MAX)
 {   
     printf("/n>>");  
  scanf("%d %d", &x[count], &y[count]);
  if(x[count] < 0)        
   break;     
  count++;  
  }   
 if(count >= MAX)
 {     
  printf("/n超出最大访客数(%d)", MAX);
  count--;   
 }    


 // 预先排序 
 quicksort(x, 0, count);
 quicksort(y, 0, count); 

 while(time < 25)
 {      
  printf("/n%d 时的最大访客数:%d", 
   time, maxguest(x, y, count, time));   
     time++;  
 }   
 printf("/n");
 return 0;
}
int maxguest(int x[], int y[], int count, int time)
 { 
 int i, num = 0;
    for(i = 0; i <= count; i++)
 {     
  if(time > x[i])
            num++;   
  if(time > y[i])  
   num--;  
  }  
 return num;
}
int partition(int number[], int left, int right)
{   
 int i=right-1, j=left, s,temp,ss;
    s=number[left],ss=left;
ll:for(temp=right-1;temp>=0;temp--)
   {         if(i==j)return ss;
        if(temp==ss)
      break;
             if(number[temp]>=s)
    {
         SWAP(number[temp],number[ss]);
      ss=temp;
            s=number[ss];
         i--;
      goto lr;
    }
   }
lr:for(temp=left;temp<right;temp++)
 {
             if(i==j)return ss;
               if(temp==ss)
     break;
    if(number[temp]<=s)
    {
               SWAP(number[temp],number[ss]);
      ss=temp;
            s=number[ss];
         j++;
      goto ll;
    }
 }
 return ss;
}
void quicksort(int number[], int left, int right)
{   
 int q,i; 
 if(left < right)
 {    

  q = partition(number, left, right);
        quicksort(number, left, q); //这里要小心不要写成q-1
  quicksort(number, q+1, right); 
      
 
 }
  else if(left==right)
  {
   printf("/n现在的顺序为:/n");
         for(i=0;i<=right;i++)
   {
    printf("%d ",number[i]);
   }
   printf("/n");
  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值