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

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

      快速排序(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");
  }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 快速排序是一种分治算法,通常用于数组的排序。它的基本思想是选取一个元素作为基准,将数组分成两部分,使得基准左边的数都小于基准,右边的数都大于基准。然后递归地对两个部分进行快速排序,直到所有的数都有序。 以下是一个 Python 的快速排序实现: ``` def quick_sort(array): if len(array) <= 1: return array pivot = array[0] less = [x for x in array[1:] if x <= pivot] greater = [x for x in array[1:] if x > pivot] return quick_sort(less) + [pivot] + quick_sort(greater) ``` ### 回答2: 快速排序(Quick Sort)是一种高效的排序算法,它采用分治的思想,通过递归地将待排序的序列划分为两部分,以一个基准元素为中心,将小于基准的元素放在左边,大于基准的元素放在右边,再分别对左右两部分继续进行排序,最后将排好序的子序列进行合并,即可得到最终的有序序列。 在Python中,可以通过以下方式实现快速排序算法: ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[0] # 选择第一个元素作为基准 less = [x for x in arr[1:] if x <= pivot] # 小于等于基准的元素 greater = [x for x in arr[1:] if x > pivot] # 大于基准的元素 return quick_sort(less) + [pivot] + quick_sort(greater) # 递归地对左右两部分进行排序,再合并 ``` 以上代码中,首先判断输入的数组`arr`的长度是否小于等于1,如果是,则直接返回该数组。否则,选取第一个元素作为基准`pivot`,利用列表推导式将小于等于基准的元素放在`less`中,大于基准的元素放在`greater`中。然后,递归地对`less`和`greater`分别进行快速排序,并将排序好的`less`、基准`pivot`和`greater`组合在一起返回。 在调用时,可以通过`quick_sort(arr)`来对数组`arr`进行快速排序快速排序的时间复杂度为O(nlogn),在平均和最好情况下都能够达到这个时间复杂度,但在最坏情况下可能会达到O(n^2)的时间复杂度。在空间复杂度上,快速排序是原地排序算法,即使用常数级的额外空间。 ### 回答3: 快速排序是一种常用的排序算法,通过比较和交换元素的方式实现排序。其原理是选择一个基准数,将待排序序列分割为两个子序列,其中一个序列的所有元素都比基准数小,另一个序列的所有元素都比基准数大,然后分别对这两个子序列进行递归排序,最后拼接得到有序序列。 在Python中实现快速排序有多种方式,下面是一种基于递归实现的示例代码: ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[0] # 选择第一个元素作为基准数 left = [x for x in arr[1:] if x < pivot] # 将比基准数小的元素放到左子序列 right = [x for x in arr[1:] if x >= pivot] # 将比基准数大的元素放到右子序列 return quick_sort(left) + [pivot] + quick_sort(right) # 递归排序左右子序列,并拼接起来 # 测试 arr = [6, 2, 8, 5, 1, 9] sorted_arr = quick_sort(arr) print(sorted_arr) ``` 在该代码中,`quick_sort`函数接受一个列表作为参数,并返回排序后的新列表。首先,判断列表长度是否小于等于1,若是,则直接返回原列表。否则,选择第一个元素作为基准数,并分别将比基准数小和大的元素放到左右子序列。然后,递归调用`quick_sort`函数对左右子序列进行排序,并将结果拼接起来,最后返回。 执行上述代码,将输出排序后的结果:[1, 2, 5, 6, 8, 9]。快速排序的时间复杂度是O(nlogn),具有较快的排序速度,因此在实际应用中被广泛采用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值