当前位置:网站首页>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 !
边栏推荐
- Loop invariant
- leetcode:881. lifeboat
- Two Bi development, more than 3000 reports? How to do it?
- Thymeleaf th:classappend属性追加 th:styleappend样式追加 th:data-自定义属性
- js亮瞎你眼的日期选择器
- CPU design practice - Chapter 4 practice task 3 use pre delivery technology to solve conflicts caused by related issues
- CPU设计相关笔记
- PMP考试20天能通过吗?
- How to protect user privacy without password authentication?
- Sharing the 12 most commonly used regular expressions can solve most of your problems
猜你喜欢
freesurfer运行完recon-all怎么快速查看有没有报错?——核心命令tail重定向
Topology visual drawing engine
Coding devsecops helps financial enterprises run out of digital acceleration
Interview shock 62: what are the precautions for group by?
Sharing the 12 most commonly used regular expressions can solve most of your problems
家用电器行业商业供应链协同平台解决方案:供应链系统管理精益化,助推企业智造升级
leetcode:881. 救生艇
NBA赛事直播超清画质背后:阿里云视频云「窄带高清2.0」技术深度解读
Topology可视化绘图引擎
[12 classic written questions of array and advanced pointer] these questions meet all your illusions about array and pointer, come on!
随机推荐
Thymeleaf common functions
在Pytorch中使用Tensorboard可视化训练过程
Share 20 strange JS expressions and see how many correct answers you can get
How does redis implement multiple zones?
How to make a second clip of our media video without infringement
dynamic programming
Structure - C language
PyTorch二分类时BCELoss,CrossEntropyLoss,Sigmoid等的选择和使用
想进阿里必须啃透的12道MySQL面试题
Principle and performance analysis of lepton lossless compression
C language -- structure and function
微帧科技荣获全球云计算大会“云鼎奖”!
Implement a blog system -- using template engine technology
GPS原始坐标转百度地图坐标(纯C代码)
【jvm】运算指令
maxcompute有没有能查询 表当前存储容量的大小(kb) 的sql?
【数组和进阶指针经典笔试题12道】这些题,满足你对数组和指针的所有幻想,come on !
Sharing the 12 most commonly used regular expressions can solve most of your problems
anaconda使用中科大源
Shanghai under layoffs