关闭

排序——快速排序

320人阅读 评论(0) 收藏 举报
分类:

定义:

        在快速排序算法中,使用了分治策略,将要排序的序列分成两个子序列,然后递归地对子序列进行排序,直到整个序列排序完毕。


步骤:

1.在序列中选择一个关键元素作为轴;


2.对序列进行重新排序,将比轴小的元素移到轴的前边,比轴大的元素移动到轴的后面。在进行划分之后,轴便在它最终的位置上


3.递归地对两个子序列进行重新排序:含有较小元素的子序列和含有较大元素的子序列。

        

        从上图可以看出,每次的比较选取的key元素为序列最后的元素


C语言实现:

#include <stdio.h>
#include <stdlib.h> 

void swap(int *x,int *y)
{
   int temp;
   temp = *x;
   *x = *y;
   *y = temp;
}

int choose_pivot(int i,int j )
{
   return((i+j) /2);
}

void quicksort(int list[],int m,int n)
{
   int key,i,j,k;
   if( m < n)
   {
      k = choose_pivot(m,n);
      swap(&list[m],&list[k]);
      key = list[m];
      i = m+1;
      j = n;
      while(i <= j)
      {
         while((i <= n) && (list[i] <= key))
                i++;
         while((j >= m) && (list[j] > key))
                j--;
         if( i < j)
                swap(&list[i],&list[j]);
      }
     // 交换两个元素的位置
      swap(&list[m],&list[j]);
     // 递归地对较小的数据序列进行排序
      quicksort(list,m,j-1);
      quicksort(list,j+1,n);
   }
}

void printlist(int list[],int n)
{
   int i;
   for(i=0;i<n;i++)
      printf("%d\t",list[i]);
}

void main()
{
   const int MAX_ELEMENTS = 10;
   int list[MAX_ELEMENTS];

   int i = 0;
   
   // 产生填充序列的随机数
   for(i = 0; i < MAX_ELEMENTS; i++ ){
     list[i] = rand();
   }
   printf("进行排序之前的序列:\n");
   printlist(list,MAX_ELEMENTS);
   
   // sort the list using quicksort
   quicksort(list,0,MAX_ELEMENTS-1);

   // print the result
   printf("使用快速排序算法进行排序之后的序列:\n");
   printlist(list,MAX_ELEMENTS);
}


总结:

        快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,工需要划分K-1次关键字的比较。

        最坏的情况:每次划分选取的基准(关键元素)都是当前无序区间中最小(或者最大)的记录,划分的结果就是基准左边的子区间为空(或右边的子区间为空),而划分所得的另外一个非空子区间中记录的数目,仅仅比划分前的无序区中记录的个数少一个。时间复杂度为:O(n*n)

        最好的情况:每次划分所取的基准都是当前无序区的“中值”记录,划分的结果是基准的左右两个无序区的长度大致相等。时间复杂度为:O(n*lgn)

        尽管快速排序的最坏时间复杂度为O(n*n),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快的,平均时间复杂度为O(n*lgn)。

0
0
查看评论

二分查找、快速排序对比和详解

**二分查找和快速排序(binarySearch)&&(quickSort)** 这两个都是用到分治的思想很容易搞混。而且即使binarySearch是用到分治到不一定意味着递归可以通过循环实现。而且是属于面试笔试的高频问题有必要总结一下。 由于循环相比递归少了很多内存分配和压栈的操...
  • qhrqhrqhr
  • qhrqhrqhr
  • 2016-03-24 22:19
  • 2568

多线程排序+快速排序

多线程排序,主要是将整个排序的序列分成若干份,每一个线程排序一份,所以线程排序完成之后,就进行归并,相当于多个有序序列合并成一个有序序列。 这里就需要用到线程屏障,也就是 pthread_barrier 系列函数。 屏障,通俗的说就是一个比赛跑步的过程,所以队员就绪了,才能进行...
  • qq_25425023
  • qq_25425023
  • 2017-05-24 20:07
  • 1450

顺序表上实现快速排序

快速排序 (1)定义顺序表的存储结构; (2)在顺序表上实现快速排序; (3)用大量的数据测试最好、最坏和平均情况下的排序速度。 #include #include #include using namespace std; //定义顺序表的存储结构; typedef struct { in...
  • migu77777
  • migu77777
  • 2016-12-17 21:40
  • 832

GPU快速排序笔记

利用CUDA 5.0最新推出的 Dynamic Parallelism,以往很难使用的分治法现在可以轻易的在GK110上利用这一新特性实现,非常方便: 算法思想: 随机选取一个枢纽元(pivot),对排序数组进行划分,左边一组都比枢纽元小,右边一组都等于或大于枢纽元,然后对每一个分组递归使用快排算法...
  • niexiao2008
  • niexiao2008
  • 2013-07-29 21:57
  • 1734

(高效率排序算法二)快速排序

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

[算法学习笔记]又一个采用分治法的排序算法----快速排序算法

快速排序算法快速排序算法是当前在实际排序应用中最好的选择,虽然排序算法最坏情况下的时间复杂度为O(n^2), 但是可以通过随机化的方式避免最坏情况的发生, 而快速算法的平均复杂度为O(n lgn), 而且隐含的常数因子非常小, 因此效率十分高.算法详细快排和归并排序一样也是采用分治策略的排序算法, ...
  • u014235934
  • u014235934
  • 2016-07-24 15:45
  • 1779

c语言指针实现快速排序

#include #include int Partition(int *Array,int i,int j) { int t = *(Array + i); while(i<j) { while(i=t) ...
  • u012421976
  • u012421976
  • 2016-11-19 16:56
  • 1110

Linux多线程实践(7) --多线程排序对比

屏障int pthread_barrier_init(pthread_barrier_t *restrict barrier, const pthread_barrierattr_t *restrict attr, ...
  • hanqing280441589
  • hanqing280441589
  • 2015-02-19 17:51
  • 3282

排序算法(五)快速排序多种版本

快速排序 ,就像它的名称一样,是时间复杂度比较低的一种排序算法。      我们知道,快速排序是通过分治的方法,将一个大的区间划分成小区间(找一个枢纽,将大的数放置在枢纽的右边,小的数放置在枢纽左边),然后对左右的两个小区间进行排序的过程。所以,...
  • peiyao456
  • peiyao456
  • 2016-11-22 21:23
  • 1640

Python递归实现快速排序

快速排序(QuickSort)是对冒泡排序的一种改进: 基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序 过程可以递归进行,以此达到整个数据变成有序序列。 一趟...
  • zhoufen12345
  • zhoufen12345
  • 2016-12-10 18:33
  • 1794
    个人资料
    • 访问:508447次
    • 积分:6383
    • 等级:
    • 排名:第4526名
    • 原创:160篇
    • 转载:28篇
    • 译文:0篇
    • 评论:255条
    博客专栏
    最新评论