当前位置:网站首页>Super wow fast row, you are worth learning!
Super wow fast row, you are worth learning!
2022-07-05 14:48:00 【Old fish 37】
Today we are going to talk about quick sorting , Very wow !
Take a brief look at the quick row ------

Here are three methods of fast platoon , Non optimized and optimized fast platoon
First----hoare edition
That is to say, the first established subscript is key The value of is the comparison value , It is generally believed that the first value on the left is key value , then , From the right , Look for a comparison key Small numbers , When R When you stop ,L Just move , Then find something better than key Big value , Then proceed L、R In exchange for , Eventually they will meet , The value corresponding to the encountered subscript will key Assigned to him , Then divide and rule ,
[left,key-1] key [key+1,right] It's just a recursion
Data structure must learn to draw pictures to think about problems , Make the problem clearer !

Complete code :
//hoare edition
void QuickSort(int* arr, int begin, int end)
{
// Come in and judge
if (begin >= end)
{
return;
}
int left = begin;
int right = end;
int key = left;
while (left < right)
{
// Go first to the right
while (left < right && arr[right] >= arr[key])
{
--right;
}
while (left < right && arr[left] <= arr[key])
{
++left;
}
// In exchange for
Swap(&arr[left], &arr[right]);
}
// Finally met
Swap(&arr[key], &arr[left]);
key = left;// to update key The location of
QuickSort(arr, begin, key - 1);
QuickSort(arr, key + 1, end);
}
void PrintSort(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 3,1,2,4,9,5,6};
int len = sizeof(arr) / sizeof(arr[0]);
QuickSort(arr,0, len-1);
PrintSort(arr, len);
}Here's another way , Be optimized by the great gods , It's easy to understand !
2、 Excavation method ------- As the name suggests, there is a pit

Complete code :
// Excavation method
void QuickSort(int* arr, int begin, int end)
{
if (begin >= end)
{
return;
}
int left = begin;
int right = end;
int key = arr[left];
int piti =left;// Pit position
while (left < right)// Control range
{
while (left < right && arr[right] >= key)
{
--right;
}
arr[piti] = arr[right];
piti = right;
while (left < right && arr[left] <= key)
{
++left;
}
arr[piti] = arr[left];
piti = left;
}
// And the last pit we met
arr[piti] = key;
QuickSort(arr, begin, piti - 1);
QuickSort(arr, piti + 1, end);
}
void PrintSort(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 3,1,2,4,9,5,6};
int len = sizeof(arr) / sizeof(arr[0]);
QuickSort(arr,0, len-1);
PrintSort(arr, len);
}
The third method : Front and back pointer versions

Complete code :
// Front and back pointer versions
void QuickSort(int* arr, int begin, int end)
{
if (begin >= end)
{
return;
}
int prev = begin;
int cur = begin + 1;
int key = begin;
while (cur <= end)
{
if (arr[cur] < arr[key] && ++prev != cur)
{
Swap(&arr[cur], &arr[prev]);
}
++cur;
}
// There's only one left prev
Swap(&arr[prev], &arr[begin]);
key = prev;
QuickSort(arr, begin, key - 1);
QuickSort(arr, key + 1, end);
}
void PrintSort(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 3,1,2,4,9,5,6};
int len = sizeof(arr) / sizeof(arr[0]);
QuickSort(arr,0, len-1);
PrintSort(arr, len);
}I believe it's not difficult for you to learn these three methods of fast platoon , But that is not optimized , Next, let's optimize it ! The time complexity of the first three methods is O(N), Not much improvement in efficiency
An optimization method —: Take the three Numbers ( Improve the front and back pointer versions )
The obstacle to efficiency is key, Not every time key It's the smallest , want No key Every time is the biggest , Then efficiency will definitely not go up , If we let key It's in the area middle Then efficiency goes to a higher level , So three numbers are taken in .
// Front and back pointer versions
void QuickSort(int* arr, int begin, int end)
{
if (begin >= end)
{
return;
}
int prev = begin;
int cur = begin + 1;
int key = begin;
// Take the three Numbers
int mid = GetMidIndex(arr, begin, end);
Swap(&arr[key], &arr[mid]);
while (cur <= end)
{
if (arr[cur] < arr[key] && ++prev != cur)
{
Swap(&arr[cur], &arr[prev]);
}
++cur;
}
// There's only one left prev
Swap(&arr[prev], &arr[begin]);
key = prev;
QuickSort(arr, begin, key - 1);
QuickSort(arr, key + 1, end);
}
Optimization method 2 : Recursion to a small subinterval , Consider using insert sort

Because when the data is in order or close to order , The efficiency of insertion sorting is very impressive , As for why not use hill , Pile up , Because it is faster to use them under big data , But the near ordered time complexity insertion sort is better !
These data can be divided into regions. Finally, the number of recursions close to order accounts for half , So it's very huge .
Area optimization code :

The insertion sort here arr If not begin Words , Then every time it is the front 20 Number to sort , So meaningless ,arr+begin It's in different areas begin----end
This optimization is very cool !
These quick rows are recursive , Recursion is also a disadvantage , So we must also master non recursive methods
Non recursive, we use the stack to complete fast scheduling
The nature of stack is first in and last out , We can use this property perfectly !
Ideas :
It's exactly like the way trees work , Finish sorting the left tree first , Then sort the right tree , Exhausted to the last area , Finally, destroy the stack again to realize non recursive fast sorting
A little more vivid : Of course, using queues is the same , Just make good use of the nature of the queue , Control it

Because this is pure C So first rub a stack , To C++ There's no need for such trouble ,
Non recursive complete code :
// Stack
typedef struct Stack
{
int* arr;
int top;
int capacity;
}Stack;
void InitStack(Stack* ps)
{
ps->arr = NULL;
ps->top = ps->capacity = 0;
}
void StackPush(Stack* ps,int x)
{
// Check whether it is full
if (ps->top == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
int tmp = (int *)realloc(ps->arr,sizeof(int )*newcapacity);
ps->arr = tmp;
ps->capacity = newcapacity;
}
ps->arr[ps->top] = x;
ps->top++;
}
void StackPop(Stack* ps)
{
ps->top--;
}
void DestoryStack(Stack* ps)
{
ps->arr = NULL;
ps->top = ps->capacity = 0;
}
int StackTop(Stack* ps)
{
return ps->arr[ps->top-1];
}
bool StackEmpty(Stack* ps)
{
return ps->top==0;
}
// Stack to achieve non recursive fast scheduling
void QuickSort(int* arr, int begin, int end)
{
Stack st;
InitStack(&st);
StackPush(&st, end);
StackPush(&st, begin);
while (!StackEmpty(&st))
{
int left = StackTop(&st);
StackPop(&st);
int right = StackTop(&st);
StackPop(&st);
int keyi = QuickSort2(arr, left, right);
if (left < keyi - 1)
{
StackPush(&st, keyi - 1);
StackPush(&st, left);
}
if (keyi + 1 < right)
{
StackPush(&st, right);
StackPush(&st, keyi + 1);
}
}
DestoryStack(&st);
}
void PrintSort(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 3,1,2,4,9,5,6};
int len = sizeof(arr) / sizeof(arr[0]);
QuickSort(arr,0,len-1);
PrintSort(arr, len);
}partners ! Give it a try !!
If there is a mistake , Please point out !
边栏推荐
- Principle and performance analysis of lepton lossless compression
- 微帧科技荣获全球云计算大会“云鼎奖”!
- 【leetcode周赛总结】LeetCode第 81 场双周赛(6.25)
- SSL证书错误怎么办?浏览器常见SSL证书报错解决办法
- 日化用品行业智能供应链协同系统解决方案:数智化SCM供应链,为企业转型“加速度”
- webRTC SDP mslabel lable
- Topology visual drawing engine
- Implement a blog system -- using template engine technology
- Photoshop plug-in action related concepts actionlist actiondescriptor actionlist action execution load call delete PS plug-in development
- Handwriting promise and async await
猜你喜欢

CODING DevSecOps 助力金融企业跑出数字加速度

Interview shock 62: what are the precautions for group by?

Topology visual drawing engine

【jvm】运算指令

快消品行业SaaS多租户解决方案,构建全产业链数字化营销竞争力

Thymeleaf th:with use of local variables

Chow Tai Fook fulfills the "centenary commitment" and sincerely serves to promote green environmental protection

SaaS multi tenant solution for FMCG industry to build digital marketing competitiveness of the whole industry chain

家用电器行业商业供应链协同平台解决方案:供应链系统管理精益化,助推企业智造升级

微帧科技荣获全球云计算大会“云鼎奖”!
随机推荐
直播预告|如何借助自动化工具落地DevOps(文末福利)
Opengauss database source code analysis series articles -- detailed explanation of dense equivalent query technology (Part 2)
CPU设计相关笔记
anaconda使用中科大源
What about SSL certificate errors? Solutions to common SSL certificate errors in browsers
Niuke: intercepting missiles
[detailed explanation of Huawei machine test] happy weekend
NBA赛事直播超清画质背后:阿里云视频云「窄带高清2.0」技术深度解读
Thymeleaf th:classappend attribute append th:styleappend style append th:data- custom attribute
Structure - C language
GPS原始坐标转百度地图坐标(纯C代码)
Thymeleaf 使用后台自定义工具类处理文本
启牛学堂班主任给的证券账户安全吗?能开户吗?
leetcode:881. 救生艇
CPU design practice - Chapter 4 practical task 2 using blocking technology to solve conflicts caused by related problems
freesurfer运行完recon-all怎么快速查看有没有报错?——核心命令tail重定向
Want to ask the big guy, is there any synchronization from Tencent cloud Mysql to other places? Binlog saved by Tencent cloud MySQL on cos
裁员下的上海
Detailed explanation of usememo, memo, useref and other relevant hooks
How does redis implement multiple zones?