忙了几个小时,终于研究出来了自己的快速排序方法,先看具体原理。
快速排序(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");
}
}