快速排序的多种思路实现

快速排序的多种思路实现:

两边想中间靠拢:

//  两边想中间靠拢,当a[left]<key a[right]>key时,两者交换
int PartSortBothSize(int *a, int left, int right)
{
 assert(a != NULL);
 int key = a[right];
 int begin = left;
 int end = right - 1;
 while (begin < end)
 {
  while (begin<end && (a[begin]<=key))
  {
   ++begin;
  }
  while (begin<end&&(a[end]>=key))
  {
   --end;
  }
  if (begin < end)
  {
   swap(a[begin], a[end]);
  }
 }
 if (a[begin]>a[right])
 {
  swap(a[begin], a[right]);
  return begin;
 }
 return right;
}

挖坑法:

//   挖坑法left right是坑 a[left]>key 时 将a[left]放到right位置,a[right]<key时,将a[right]放到left位置
int PartSortPotholing(int *a, int left, int right)
{
 assert(a != NULL);
 int key = a[right];
 int begin = left;
 int end = right;
 while (left<right)
 {
  while (left<right&&a[left] <= key)
  {
   left++;
  }
  if (left < right)
  {
   a[right] = a[left];
   right--;
  }

  while (left<right&&a[right] >= key)
  {
   right--;
  }
  if (left < right)
  {
   a[left] = a[right];
   left++;
  }
 }

 a[left] = key;
 return left;
}

顺向

//顺向
//left、right从左向右走,当a[left]<key时,left停止,当a[right]>key,right停止,交换两者对应的值
int PartSortBothRight(int *a, int left, int right)
{
 assert(a != NULL);
 int key = a[right];
 int prev = left;
 while (a[left] < key)//当开始的数字比key小移动left、prev
 {
  left++; prev++;
 }
 while (left < right)
 {
  while (left < right&&a[left] >= key)
  {
   left++;
  }
  while (left < right&&a[prev] <= key)
  {
   prev++;
  }
  if (left < right)
  {
   swap(a[left], a[prev]);
   left++; prev++;
  }
 }
 
 swap(a[prev], a[left]);
 return prev;
}

调用函数:

void _QuickSort(int *a, int left,int right)
{
 assert(a != NULL);
 if (left >= right)
 {
  return;
 }
 //int div = PartSortBothSize(a, left, right);
 //int div = PartSortPotholing(a, left, right);
 int div = PartSortBothRight(a, left, right);
 if (div > 0)
 {
  _QuickSort(a, left, div - 1);
 }
 if (div < right - 1)
 {
  _QuickSort(a, div + 1, right);
 }
}

void QuickSort(int *a, size_t size)
{
 assert(a != NULL);
 if (size > 1)
 {
  _QuickSort(a, 0, size - 1);
 }
}

test:

int a4[] = { 0, 5, 2, 1, 5, 5, 7, 8, 5, 6, 9, 4, 3, 5, -2, -4, -1 };

时间: 2024-11-05 14:59:49

快速排序的多种思路实现的相关文章

多种思路解决Keepalived限制死20个VIP问题

由于业务需要,在部署LVS+Keepalived时,公司申请了一个C网段,让keepalived绑定254个VIP地址.满满的以为没有一点问题,但却遇到了keepalived限制死20 VIP的问题.刚开始一无所措,但经过思考,以及请教别人,得到了很多种思路,虽然有些思路并没解决问题,但思路本身就是很重要的,因为以后难免会用同样思路解决其他的问题. 问题现象如下: # tail /var/log/syslog Nov 12 18:15:34 Telcom-DG-WY-LVS-13-130 Kee

QuickSort快速排序的多种实现

并不是很懂wikipedia上面说快排的空间复杂度最坏情况是O(NlogN)啊,难道不是空间复杂度平均O(logN),最坏O(N)么--原地快排难道不是只要算递归栈深度就好了么--有谁给我解释一下啊(评论区orz). 快排的核心思想我感觉就是选一个pivot,然后将待排序数列通过与pivot比较分为两个部分A和B(A部分的数均小于或等于pivot,B部分均大于或等于pivot),这样划分好的数列中的数就处于A <= pivot <= B的状态,接着对划分好的两个部分A和B分别递归调用快排函数,

动态规划_基础_任意子区间序列求和问题_滑动窗口解法_多种思路_分治思想演变

题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入描述 第一行是一个正整数 N ( 1 ≤ N ≤ 200000 ) ,表示了序列的长度. 接下来的 N 行包含 N 个绝对值不大于 10000 的整数 A [ i ] ,描述了这段序列. 输出描述 仅包括 1 个整数,为最大的子段和是多少,子段的最小长度为 1 . 样例输入 72-43-12-43 样例输出 4 Hint Origin: SidneyEdit by stdKonjac in 2020 解题思路: 关于求子区间求

100对黑白球问题的多种思路

<编程之美>的概率题:一个桶里面有白球.黑球各100个,现在按下述规则取球: i .每次从通里面拿出来两个球: ii.如果取出的是两个同色的球,就再放入一个黑球: ii.如果取出的是两个异色的球,就再放入一个白球. 问:最后桶里面只剩下一个黑球的概率是多少? 第一种方案(只关注一种球的变化): i.如果取出的是两个白球,白球减少2个. ii.如果取出的是两个黑球,白球不变. iii.如果取出的是一黑一白,再放入一个白球,导致白球没变. 综上,白球的变化情况是2,0,0,所以白球只会存在偶数,不

排序之快速排序

package com.xsz.demo; /**     * @author cwqi    * @date 2015-1-6    */ //排序之快速排序,基本思路為分治+挖坑,方法有兩種:一是雙邊掃面:二是單邊掃描. public class QuickSort { public static void main (String[] args){ int a[] ={2,3,30,1,4,56,2,7,3,8}; //int a[] ={4,5,6,2,7,3,8}; //int a[]

十大基础实用算法之快速排序和堆排序

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元素,称为 "基准"(pi

快速排序算法原理及实现(单轴、三向切分、双轴)

欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. 单轴快速排序的基本原理 快速排序的基本思想就是从一个数组中任意挑选一个元素(通常来说会选择最左边的元素)作为中轴元素,将剩下的元素以中轴元素作为比较的标准,将小于等于中轴元素的放到中轴元素的左边,将大于中轴元素的放到中轴元素的右边,然后以当前中轴元素的位置为界,将左半部分子数组和右半部分子数组看成两个新的数组,重复上述操作,直到子数组的元素个数小于等于1(因为一个元素的数组必定是有

数据结构-快速排序(C#实现)

快速排序的主要思路: 1.在数组首尾处各设一个标记 2.取出数组第一个值作为中枢值 3.所有数据跟中枢值比较:比中枢值小的放中枢值左边,首部标记++往右推一位,大的放中枢值右边,尾部标记--往左推一位(从小到大排序) 4.先从尾部开始与中枢值比较,如果尾部标记的值比中枢值大直接把标记往左推一位,如果尾部标记比中枢值小就把尾部标记的值放到首部标记的位置,然后开始从首部开始与中枢值比较,如果首部标记的值比中枢值小直接把标记往右推一位,如果首部标记比中枢值大就把首部标记的值放到尾部标记的位置,一直循环

java:快速排序算法与冒泡排序算法

 Java:快速排序算法与冒泡算法 首先看下,冒泡排序算法与快速排序算法的效率: 如下的是main方法: public static void main(String[] args) { //快速排序算法测试 int[] qArray = new int[100000]; for (int i = 0; i < 100000; i++){ qArray[i] = (int) (Math.random() * 100000); } long beforeQ = System.currentTi