快速排序和随机快速排序

简介: 快速排序和随机快速排序

快速排序


严书上的快排是以最左边元素为枢纽的,如下:


#include <iostream>
#include<algorithm>
using namespace std;
int Partition(int a[],int left,int right){      
  int  p=a[left];                          //传统快排 
  while(left<right){
    while(a[right]>p&&left<right)right--;
    a[left]=a[right];
    while(a[left]<p&&left<right)left++;
    a[right]=a[left]; 
  }
  a[left]=p;
  return left;  
}
void quicksort(int a[],int left,int right){      //快速排序 
  if(left<right){
  int p=Partition(a,left,right);
  quicksort(a,left,p-1);
    quicksort(a,p+1,right); 
}
}
int main(){
    int a[6]={5,7,6,8,3,1};
  quicksort(a,0,5);
  for(int i=0;i<6;i++)
  cout<<a[i]<<" ";
  cout<<endl; 
  return 0; 
} 

注意在Partition函数里面利用了两个标杆左右同时遍历,方法巧妙


2.随机快速排序


实际上,如果原始序列本身就接近于有序,利用上面的快排效率和变低,因为枢纽没有把序列划分为两个长度接近的子区间,这时可以采用随机枢纽,只需要再上面的Partition函数前面生成一个区间范围内的随机数即可,这要用到srand(),和rand()和time()几个函数,注意头文件的添加,得随机快速排序如下。

#include <iostream>
#include<algorithm>
#include<time.h>
using namespace std;
int Partition(int a[],int left,int right){      
  int r=rand()%(right-left+1)+left;
  swap(a[r],a[left]);                       //随机快排 
  int  p=a[left];                          //传统快排 
  while(left<right){
    while(a[right]>p&&left<right)right--;
    a[left]=a[right];
    while(a[left]<p&&left<right)left++;
    a[right]=a[left]; 
  }
  a[left]=p;
  return left;  
}
void quicksort(int a[],int left,int right){      //快速排序 
  if(left<right){
  int p=Partition(a,left,right);
  quicksort(a,left,p-1);
    quicksort(a,p+1,right); 
}
}
int main(){
  srand((unsigned) time(NULL));
    int a[6]={5,7,6,8,3,1};
  quicksort(a,0,5);
  for(int i=0;i<6;i++)
  cout<<a[i]<<" ";
  cout<<endl; 
  return 0; 
} 
相关文章
|
7月前
|
算法 搜索推荐 C++
基本算法-快速排序
基本算法-快速排序
|
5月前
|
算法 搜索推荐 大数据
【算法】排序——归并排序和计数排序
上两篇文章讲解了插入排序、选择排序以及交换排序,每种类型的排序大类下都有一到两种排序,今天给大家带来的是归并排序,和前面几种排序一样都属于比较排序中的一种,是通过比较数组中的元素来实现排序的,还给大家带来一种非比较排序计数排序,让我们开始今天的排序之吧!!!
|
5月前
|
算法
【算法】排序——选择排序和交换排序(快速排序)
上篇文章讲述了插入排序及插入排序的优化希尔排序,今天我们继续给大家带来排序中的选择排序和交换排序,选择排序包括直接选择排序、 其中还包括堆排序,因为之前讲过堆排序,这篇文章就不多讲解,点击直达堆排序。交换排序包括冒泡排序、快速排序。让我们开始今天的选择排序之旅吧!!!
|
7月前
|
算法 搜索推荐 C++
基本算法-选择排序
基本算法-选择排序
|
10月前
|
算法
【快速排序】快速排序/第k个数
【快速排序】快速排序/第k个数
|
11月前
|
算法 搜索推荐
[算法]之快速排序
[算法]之快速排序
39 0
|
11月前
|
搜索推荐 算法
【排序算法(三)】交换排序(冒泡排序&&快速排序)(下)
【排序算法(三)】交换排序(冒泡排序&&快速排序)(下)
|
11月前
|
存储 人工智能 搜索推荐
【排序算法(三)】交换排序(冒泡排序&&快速排序)(上)
【排序算法(三)】交换排序(冒泡排序&&快速排序)(上)
|
算法 搜索推荐 大数据
【算法】快速排序
快速排序是一种非常高效的算法。首先排序速度比较快,这个从名字就可以看出来,快速排序的平均时间复杂度为O(nlogn),最坏情况为O(n2),最好情况为O(n)。
83 0
【算法】快速排序
|
机器学习/深度学习 算法 JavaScript
每天一点算法-快速排序-(Day4)
每天一点算法-快速排序-(Day4)
93 0

热门文章

最新文章