当前位置:网站首页>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 !
边栏推荐
- 729. My schedule I: "simulation" & "line segment tree (dynamic open point) &" block + bit operation (bucket Division) "
- Jmeter性能测试:ServerAgent资源监控
- mysql8.0JSON_ Instructions for using contains
- Online electronic component purchasing Mall: break the problem of information asymmetry in the purchasing process, and enable enterprises to effectively coordinate management
- ASP. Net large takeout ordering system source code (PC version + mobile version + merchant version)
- 用 Go 跑的更快:使用 Golang 为机器学习服务
- 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
- 外盘入金都不是对公转吗,那怎么保障安全?
- MongDB学习笔记
- Does maxcompute have SQL that can query the current storage capacity (KB) of the table?
猜你喜欢

leetcode:881. lifeboat

如何将电脑复制的内容粘贴进MobaXterm?如何复制粘贴

Sharing the 12 most commonly used regular expressions can solve most of your problems

周大福践行「百周年承诺」,真诚服务推动绿色环保

【华为机试真题详解】字符统计及重排

freesurfer运行完recon-all怎么快速查看有没有报错?——核心命令tail重定向

How can non-technical departments participate in Devops?

CYCA少儿形体礼仪 宁波市培训成果考核圆满落幕

Talking about how dataset and dataloader call when loading data__ getitem__ () function

Photoshop插件-动作相关概念-ActionList-ActionDescriptor-ActionList-动作执行加载调用删除-PS插件开发
随机推荐
面试突击62:group by 有哪些注意事项?
Penetration testing methodology
漫画:优秀的程序员具备哪些属性?
Solution of commercial supply chain collaboration platform in household appliance industry: lean supply chain system management, boosting enterprise intelligent manufacturing upgrading
How to choose the appropriate certificate brand when applying for code signing certificate?
两个BI开发,3000多张报表?如何做的到?
Two policemen were shot dead in a "safety accident" in Philadelphia, USA
useMemo,memo,useRef等相关hooks详解
如何将电脑复制的内容粘贴进MobaXterm?如何复制粘贴
通过npm 或者 yarn安装依赖时 报错 出现乱码解决方式
Differences between IPv6 and IPv4 three departments including the office of network information technology promote IPv6 scale deployment
Thymeleaf 模板的创建与使用
anaconda使用中科大源
超级哇塞的快排,你值得学会!
Postgresql 13 安装
【C 题集】of Ⅷ
美国费城发生“安全事故” 2名警察遭枪杀
CPU design practice - Chapter 4 practical task 2 using blocking technology to solve conflicts caused by related problems
Topology visual drawing engine
Coding devsecops helps financial enterprises run out of digital acceleration