数据结构-排序-快排

                快速排序

  首先快速排序步骤:

  • 首先选择轴值
  • 把待排序内容分为两部分,左边为小于或者等于轴值,右边为大于轴值
  • 然后对左右重复上面步骤直到整个序列有序
  • 直接上代码这里先写一次划分的代码
  • 这里的一次划分是那第一个数字为轴值,我们也可以用最后一个或者中间的。
  • #include<iostream>
    #include<vector>
    using namespace std;
    //不含暂存单元的数组v1
    int temp1[]={59,20,17,36,98,14,23,83,13,28};
    vector<int>  v1(begin(temp1),end(temp1));
    //打印数组
    inline void  printV(const vector<int> &v)
    {
        for(auto a:v)
            cout<<a<<" ";
        cout<<endl;
    }
    //第一次划分
    //快速排序第一次划分
    int Partition(vector<int> &v,int first,int end)
    {
        int i=first;
        int j=end;
        printV(v);
        cout<<"此时i="<<i<<"  此时j="<<j<<"  ";
        while(i<j)
        {
            while(i<j&&v[i]<v[j])
            {j--;
            cout<<"此时i="<<i<<"  此时j="<<j<<endl;}
            if(i<j)//假如i<j  交换ij
            {
                cout<<"交换"<<"  ";
                int temp=v[j];
                v[j]=v[i];
                v[i]=temp;
                i++;
                printV(v);
                cout<<"此时i="<<i<<"  此时j="<<j<<"  ";
            }
            cout<<endl;
            while(i<j&&v[i]<=v[j])
               { i++;
                cout<<"此时i="<<i<<"  此时j="<<j<<endl;}
            if(i<j)
            {
                cout<<"交换"<<"  ";
                int temp=v[j];
                v[j]=v[i];
                v[i]=temp;
                j--;
                printV(v);
                cout<<"此时i="<<i<<"  此时j="<<j<<"  ";
            }
        }
        printV(v);
        return i;
    }
    //这里我们先直接调用一次划分理解下如何划分的
    int main(int argc, char *argv[])
    {
        Partition(v1,0,v1.size()-1);
        return 0;
    }

    然后上运行截图分析

  

  • 首先取59为轴值,然后因为要左边比59小,右边比59大
  • 59与28比较发现59大于28 交换
  • 交换后继续遍历左侧。于是i++,遍历到98发现59小了,交换
  • 然后此时左边必然都小于59,但是右边不确定,开始遍历J
  • J=8发现13小于59然后再次交换,然后右边必然大于59,左边不确定,继续遍历i
  • i=7时59<83交换
  • 这是i=j不满足i<j的条件跳出循环
  • 此时以59为轴值,左边都小于59右边都大于

  接下来就是完整的包含递归的快排了

  先上代码

#include<iostream>
#include<vector>
using namespace std;
//不含暂存单元的数组v1
int temp1[]={59,20,17,36,98,14,23,83,13,28};
vector<int>  v1(begin(temp1),end(temp1));
//打印数组
inline void  printV(const vector<int> &v)
{
    for(auto a:v)
        cout<<a<<" ";
    cout<<endl;
}
//快速排序一次划分
int Partition(vector<int> &v,int first,int end)
{
    int i=first;
    int j=end;
    printV(v);
    cout<<"此时i="<<i<<"  此时j="<<j<<"  ";
    while(i<j)
    {
        while(i<j&&v[i]<v[j])
        {j--;
        cout<<"此时i="<<i<<"  此时j="<<j<<endl;}
        if(i<j)//假如i<j  交换ij
        {
            cout<<"交换"<<"  ";
            int temp=v[j];
            v[j]=v[i];
            v[i]=temp;
            i++;
            printV(v);
            cout<<"此时i="<<i<<"  此时j="<<j<<"  ";
        }
        cout<<endl;
        while(i<j&&v[i]<=v[j])
           { i++;
            cout<<"此时i="<<i<<"  此时j="<<j<<endl;}
        if(i<j)
        {
            cout<<"交换"<<"  ";
            int temp=v[j];
            v[j]=v[i];
            v[i]=temp;
            j--;
            printV(v);
            cout<<"此时i="<<i<<"  此时j="<<j<<"  ";
        }
    }
    printV(v);
    cout<<"一次part结束"<<endl;
    return i;
}

//快排
void QuickSort(vector<int> &v,int first,int end)
{
    if(first<end)
    {
        int pivot=Partition(v,first,end);
        QuickSort(v,first,pivot-1);;
        QuickSort(v,pivot+1,end);
    }
}

int main(int argc, char *argv[])
{
    QuickSort(v1,0,v1.size()-1);
    return 0;
}
  • 我们先看下QuickSort函数,当partition函数返回i,i就是刚才59的位置
  • 我们此时以59为分界线,分为左右两侧,分别对左右继续划分,直到所有的每次递归first-end的范围的数量=1则跳出
  • 看下下面的递归第一次partition调用结束后,QuickSort后面的参数是v,,first,i的位置-1  比如第一次递归就是  v[0]到59的位置减1
  • 然后后面的就是59+1到v.end();
  • 我们运行程序看下


  • 这是不停的对左侧左侧左侧的递归


  • 这是不停的对右侧右侧递归。由于右侧数字很少,递归也很快结束了。

    

    

原文地址:https://www.cnblogs.com/DJC-BLOG/p/9069400.html

时间: 2024-08-10 15:11:38

数据结构-排序-快排的相关文章

区间模糊排序---快排思路的应用

1 #include<iostream> 2 #include<ctime> 3 using namespace std; 4 #define max(a,b) (a>b)?a:b 5 #define min(a,b) (a>b)?b:a 6 class Interval 7 { 8 public: 9 double leftbound; 10 double rightbound; 11 Interval(int a, int b) :leftbound(a), rig

数据结构排序问题-------快排

快排实现基本思想:取个关键key值对整个序列进行比较,大的放一边,小的放另一边(这就分成两个序列了).然后继续对两个序列(分开的)进行递归比较,最后实现整个序列的排序. 最坏情况的时间复杂度为O(n2),最好情况时间复杂度为O(nlog2n). package com; //快速排序 public class quick { //主函数实现排后的输出显示 public static void main(String[] args){ int[]a = {21,32,1,332,42,3,12,7

数据结构——排序——快排序算法

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实作出来. 使用快速排序法对一列数字进行排序的过程 算法原理 快速排序采用一种“分而治之.各个击破”的观念. 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列

[排序] 快排 &amp;&amp; 冒泡(自己写)

#include <iostream> using namespace std; /* 快速排序 通过一趟排序,以轴点为界 分割为两部分:左部分 <= 轴点 <= 右部分 再分别对左右两部分继续递归排序 最终整个序列有序 */ void quickSort(int arr[], int low,int high){ //if (arr==NULL||length<=0||start<=0||end>=length) //break; int i,key,j; if

总结4种常用排序(快排、选择排序、冒泡排序、插入排序)

一. 选择排序 概念理解: 在一个长度为3的数组中,在第一趟遍历3个数据,找出其中最小的数值与第一个元素交换: 第二趟遍历2个数据,找出其中最小的元素与第一个数交换(注意:这里的第一个数是指遍历的第一个数,实质上是数组的第二个数) 而第三趟则是和自己比较,位置还是原来的位置 复杂度: 平均时间复杂度:O(n^2) 例子: //选择排序 function selectionSortFn(arr){ console.log('原数组:['+ arr + ']') for (var i = 0; i

数据结构-链表快排

1 #include<cstdio> 2 #include<cstdlib> 3 #include<string> 4 5 struct Node{ 6 int num; 7 Node* next; 8 }; 9 10 void Add(Node **head, int num){ 11 Node *node = new Node; 12 node->num = num; 13 node->next = *head; 14 (*head) = node; 1

快速排序(快排)

快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 算法处理过程(截图参考 坐在马桶上看算法:快速排序): 代码: public class QuickSort { public static void sort(int[] arr, int low, int high){ i

SDUT 3398 数据结构实验之排序一:一趟快排

数据结构实验之排序一:一趟快排 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定N个长整型范围内的整数,要求输出以给定数据中第一个数为枢轴进行一趟快速排序之后的结果. Input 连续输入多组数据,每组输入数据第一行给出正整数N(N < = 10^5),随后给出N个长整型范围内的整数,数字间以空格分隔. Output 输出一趟快速排序后的结果,数字间以一个空格间隔,行末不得有多余空格.

SDUT-3398_数据结构实验之排序一:一趟快排

数据结构实验之排序一:一趟快排 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定N个长整型范围内的整数,要求输出以给定数据中第一个数为枢轴进行一趟快速排序之后的结果. Input 连续输入多组数据,每组输入数据第一行给出正整数N(N < = 10^5),随后给出N个长整型范围内的整数,数字间以空格分隔. Output 输出一趟快速排序后的结果,数字间以一个空格间隔,行末不得有多余空格. Sample Input