双向快速排序

#include <iostream>
using namespace std;

void swap(int* p,int* q)
{
    int temp = *p;
    *p = *q;
    *q = temp;
}

//快速排序
int partition(int *ptr,int first, int last)
{
    int temp = ptr[first];
    int i = first + 1, j = last;
    while(i < j)
    {
        while(ptr[i] < temp && i <= last)
            ++i;
        while(ptr[j] > temp)
            --j;
        if(i < j)
        {
            swap(&ptr[i],&ptr[j]);
            ++i;
            --j;
        }    

    }

    swap(&ptr[first],&ptr[j]);
    return j;
} 

void quickSort(int *ptr,int first,int last)
{
    if(first < last)
    {
        int q = partition(ptr,first,last);

        quickSort(ptr,first,q-1);
        quickSort(ptr,q+1,last);
    }
}
int main()

{
    int a[] = {2,23,45,1,8,2,0};
     for(int i =0; i <= 6; ++i)
    {
        std::cout << a[i] << " ";
    }
    cout << endl;
    //mergeSort(a,0,6);
    quickSort(a,0,6);
    for(int i =0; i <= 6; ++i)
    {
        std::cout << a[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}
时间: 2024-12-17 14:25:35

双向快速排序的相关文章

【最全】经典排序算法(C语言)

本文章包括所有基本排序算法(和其中一些算法的改进算法): 直接插入排序.希尔排序.直接选择排序.堆排序.冒泡排序.快速排序.归并排序.基数排序. 算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首元素,并把它赋值给temp变量: 从排好的序列中,依次与temp进行比较,如果元素比temp大,则将元素后移(实际上放置temp的元素位置已经空出) 直到

笔试算法题(54):快速排序实现之单向扫描、双向扫描(single-direction scanning, bidirectional scanning of Quick Sort)

议题:快速排序实现之一(单向遍历) 分析: 算法原理:主要由两部分组成,一部分是递归部分QuickSort,它将调用partition进行划分,并取得划分元素P,然后分别对P之前的部分和P 之后的部分递归调用QuickSort:另一部分是partition,选取划分元素P(随机选取数组中的一个元素,交换到数组末尾位置),定义两个标记 值left和right,随着划分的进行,这两个标记值将数组分成三部分,left之左的部分是小于划分元素P的值,left和right之间的部分是大 于等于划分元素P的

比较快速排序,冒泡排序,双向冒泡排序的执行快慢

快速排序 原理是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置.递归快速排序,将其他n-1个元素也调整到排序后的正确位置.最后每个元素都是在排序后的正 确位置,排序完成.所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归. 冒泡排序算法 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,

双向循环链表

//双向循环链表 typedef int datatype; //方便修改 //当然也可以写成模板来适应更多的数据类型 struct dclink{ datatype data;//数据定义 struct dclink *pre; struct dclink *next;//前驱和后继指针 }; class DCLink { public: DCLink();//default constructor DCLink(datatype data);//单参constructor void add(

再说快速排序

快速排序作为排序算法中的战斗机,一直是排序算法里面用的最多也是考的最多的一个算法 已经证明,对n个元素进行排序,最优的算法也是需要NLogN的时间复杂度,而快速排序的时间复杂度就是NlogN, 所以快速排序是排序算法中最优算法中的一个,下面我们继续来探索一下神奇的快速排序算法吧 快速排序的核心思想:每次排序把每一个元素k移动到正确的位置,并且把小于k的元素都移动到k的左边,大于k的元素都移动到k的右边 待排序的数列x[],长度为n 算法一:初始化k=x[m](m为待排序的第一个元素),对于每一个

快速排序一步一步优化

一.快速排序介绍 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). 算法思想:1.先从数组中取出一个数组作为枢轴,一般情况下选取数组的第一个或者最后一个元素作为枢轴,当然可以选取其他的,在后面的优化措施里面,我会慢慢介绍. 2.双向遍历,从左边选取一个比枢轴大的数,从右边选择一个比枢轴小的数,然后交换这两个数: 3.重复步骤2,直到在枢轴的左边都比枢轴小,枢轴右边的数都比枢轴大. 算

复习数据结构:排序算法(五)——快速排序的各种版本

之前已经比较熟悉快排的基本思想了,其实现的方式也有很多种.下面我们罗列一些常见的实现方式: 版本一:算法导论上的单向扫描,选取最后一个元素作为主元 #include<iostream> using namespace std; int partition(int data[], int low, int high) { int pivot = data[high]; // let the last atom be the pivot int i = low - 1; // mark the p

笔试算法题(54):快速排序实现之三路划分, 三元中值法和插入排序处理小子文件

议题:快速排序算法实现之三(三路划分遍历,解决与划分元素相等元素的问题) 分析: 算法原理:使用三路划分策略对数组进行划分(也就是荷兰国旗问题,dutch national flag problem).这个实现是对实现二的改进,它添加处理等于划分元素的值的逻辑,将所有等于划分元素的值集中在一起,并且以后都不会再对他们进行划分. 本算法中使用四个标示值进行操作.使用left和right同时向中间遍历时,当left遇见等于划分元素时,就与iflag指向的值进行交换 (iflag指向的当前值到最左端表

数据结构之---C语言实现快速排序(多个版本)

快速排序基本上有如下版本 一.国内教材双向扫描版 二.单向扫描版本 三.随机化版本 四.三数取中分割法 五.非递归版 这里给我前两个版本(较为常用) 版本一: 双向扫描版本: 如图: 代码如下: //快速排序(版本一) //带枢轴 //杨鑫 #include <stdio.h> #include <stdlib.h> #define MAXN 100 int a[MAXN + 1], n; void QuickSort(int left, int right) { int i, j