Quick Sort(快排)

这是挖坑填补法的演示

快排之挖坑填补法:

 1  void Quick(int top/*起始位置*/,int end/*末尾位置*/,int arr[])//挖坑填补法
 2 {
 3     int i=top,j=end,mark;//i是记住前面的坑 j记住后面的坑 mark记住标准值
 4
 5     mark=arr[top];//以起始位置作为标准值,同时起始点成为第一个坑
 6     if(top>=end)return;
 7     while(i<j)
 8     {
 9         while(i<j)//从后向前找比标准值小的值并且把这个值赋予坑,此点成为新的坑
10             {
11                 if(arr[j]<mark)
12                 {
13                 arr[i]=arr[j];
14
15                 i++;//前面的坑向后移动一位开始找
16                 break;
17                 }
18                 j--;
19             }
20         while(i<j)//从前向后找比标准值大的值并且把这个值赋予坑此点成为新的坑
21
22             {
23                 if(arr[i]>mark)
24                 {
25                 arr[j]=arr[i];
26                 j--;//后面的坑向前移动一位开始找
27
28                 break;
29                 }
30                 i++;
31             }
32
33     }
34     arr[j]=mark;//此时的下标就是标记值的最终位置,他的前面都比他小后面都比他大
35     Quick(top,i-1,arr);//递归
36     Quick(j+1,end,arr);
37 }

快排之区间分割法:

int sch_sect(int arr[],int j,int top)//区间分割法
{
    int s=j+1;
    while(j>0)
    {
        if(arr[j]>arr[top])//arr[top]就是标准值
        {
            if(j!=--s)//判断是否指向一个位置,(因为指向一个位置异或符号会使结果为0)
            {
                arr[j]=arr[j]^arr[s];
                arr[s]=arr[s]^arr[j];
                arr[j]=arr[s]^arr[j];
            }

        }
        j--;
    }
    s--;
    arr[top]=arr[s];//现将最终点的值赋予标准点,函数结束后将标准点的值赋予最终点
    return s;
}
void Quick(int top/*起始位置*/,int end/*末尾位置*/,int arr[])
{
    int i=top,j=end,mark;//i是记住前面的坑 j记住后面的坑 mark记住坑的值

    mark=arr[top];//以起始位置作为坑
    if(top>=end)return;
    i=sch_sect(arr,end,top);
    j=i;
    arr[j]=mark;//此时的下标就是标记值的最终位置,他的前面都比他小后面都比他大
    Quick(top,i-1,arr);//递归
    Quick(j+1,end,arr);
} 

快排是比较最少的一种排序方法

如果数组数量过少的时候直接使用插入排序而不选择快排

排序名称    最好时间复杂    平均时间复杂度度    最坏时间复杂度    空间复杂度    是否稳定

Quick        O(n*log2n)          O(n*log2n)           O(n^2)              log2n        不稳定

时间: 2024-10-18 22:09:51

Quick Sort(快排)的相关文章

Codeforces 558A Lala Land and Apple Trees(Sort快排)

A. Lala Land and Apple Trees time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Amr lives in Lala Land. Lala Land is a very beautiful country that is located on a coordinate line. Lala Land is

Collection of algorithm for sorting. 常见排序算法集(三) —— Quick Sort

Quick Sort 快排,一个排序方法能直接享受这样的名称殊荣,呵呵,可见其威力与重要性. 其中最重要的思想就是 "分治"-- divide and conquer ! 这里排序用到的思想极其简单,却是很实用的!小孩子都会的简单想法. 先把所有数据分成三个部分. 在所有数据中选取某一元素X,比X小的放左边,比X大的放右边. 接着把这一思想同样分别施加在X元素的左边和右边部分,同样继续划分,选出一个元素X' 比X'小的放左边比X'大的放右边. 继续施加这种划分策略,直到划分的元素很少(

1101. Quick Sort (25)【快排】——PAT (Advanced Level) Practise

题目信息 1101. Quick Sort (25) 时间限制200 ms 内存限制65536 kB 代码长度限制16000 B There is a classical process named partition in the famous quick sort algorithm. In this process we typically choose one element as the pivot. Then the elements less than the pivot are

C++: quick sort(快排序)

到目前为止, 我们已经学习到了插入排序, 冒泡排序, 选择排序(selection). 这些排序算法都是comparision based sorting algorithms(即涉及到元素大小的比较来决定元素的先后顺序). 而且算法的时间复杂度上均为O(n^2).但是comparision based 的排序算法远非这几个算法. 而且可以通过利用其它的一些手段(例如divide and conquer technique, 分治法)实现对基于比较的排序算法的时间复杂度降低到O(nlogn).

JavaScript快排与原生sort的测试

今天工作室断网!果断回宿舍,不然各种资料都没有.(他说将来会找到!)不好意思,又哼起来了.进入主题,大家都知道,快排是各种排序算法中,最高效的也是应用最广的,还有更重要的一点,面试特别爱考的! 其实大家或多或少都听说过快排,也就是先从取出一个基准值,然后再把其它的数与之相对比,小的放左边的集合里,大的放右边的集合里,再通过递归不断重复该步骤,实现最高效率的quickSort. Talk is cheap, show you my code! 排序结果我就不写出来啦,大家都会数大小,哈哈哈. 刚说

结构体快排回顾(sort)

一般来说,我做竞赛的时候排序一般用快排 很快很方便 普通sort(从小到大) sort(a,a+n); 直接贴一段代码吧,包含了vector,sort,结构体等简单东西综合 #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef struct example { int elem1; int elem2; }example; /*这个compariso

leetcode 75 Sort Colors 计数排序,三路快排

解法一:计数排序:统计0,1,2 的个数 时间复杂度:O(n) 空间复杂度:O(k)    k为元素的取值范围, 此题为O(1) class Solution { public: void sortColors(vector<int>& nums) { int count[3] = {0}; //存放0,1,2三个元素的频率 for(int i=0;i<nums.size();i++){ assert(nums[i] >=0 && nums[i]<=2

排序--QuickSort 快排

Quick の implementation 快排,就像它的名字一定,风一样的快.基本上算是最快的排序算法了.快排的基本思想是选择一个切分的元素.把这个元素排序了.所有这个元素左边的元素都小于这个元素,所有这个元素右边的元素都大于这个元素.接着再把左右2个数组分别排序. 假设你有如下数组 (所有 i  左边的对象都小于 切分对象. 所有 j  右边的对象都大于切分对象 这句话稍后有用 先知道一下) 首先,我们把index = 0 的元素当作切分元素. 从index = 1 的位置开始,找到第一个

pat1101. Quick Sort (25)

1101. Quick Sort (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Peng There is a classical process named partition in the famous quick sort algorithm. In this process we typically choose one element as the pivot. Then the elements