𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary_walk
⸝⋆ ━━━┓
- 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━ ➴ ⷯ本人座右铭 : 欲达高峰,必忍其痛;欲戴王冠,必承其重。
👑💎💎👑💎💎👑
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑 希望在看完我的此篇博客后可以对你有帮助哟👑👑💎💎💎👑👑 此外,希望各位大佬们在看完后,可以互相支持,蟹蟹!
👑👑👑💎👑👑👑
题目
相信前面我们学习了数据结构的八大排序对于这个题目的解答不成问题,但是从中也可以看出有些算法还是可以进行优化的
1)直接插入排序
当我们用知己插入来进行排序的话代码是跑不过去 的,因为当原数组与要排序的数组若是逆序的话就对应最坏的时间:N^2
2)堆排序
不管是用上调(时间:N*logN)算法来进行排序还是用下调(N)算法来进行排序都是可以跑过去的
3)快排
当数组有大量重复元素的时候对应最换的情况:N^2
针对这一种情况进行优化:采用三路划分把数组整体分为三部分:小于key ,大量重复为key的,大于key的
三路划分:是基于Hoare 和前后指针的思想实现的
具体实现见下:
代码:
int GetMid_i(int* a, int left, int right)
{
int mid_i = (left + right) / 2;
if (a[mid_i] > a[left])
{
if (a[left] > a[right])
return left;
else if (a[right] < a[mid_i])
return right;
else
return mid_i;
}
else //a[mi_I ] <= a[left]
{
if (a[left] < a[right])
return left;
else if (a[right] > a[mid_i])
return right;
else
return mid_i;
}
return mid_i;
}
void Quick_sort1(int*a, int begin, int end)
{
if (begin >= end)
{
return;
}
int left = begin;
int right = end;
int cur = left+ 1;
int key_i = GetMid_i(a, begin, end);
Swap(&a[begin], &a[key_i]);
int key = a[begin];
while (cur <= right)
{
if (a[cur] == key)
cur++;
else if (a[cur] > key)
{
Swap(&a[cur], &a[right]);
right--;
}
else
{
Swap(&a[cur], &a[left]);
cur++;
left++;
}
}
Quick_sort(a, begin, left - 1);
Quick_sort(a, right + 1, end);
}
int* sortArray(int* nums, int numsSize, int* returnSize) {
//Shell_sort(nums,numsSize);//直接插入排序超出时间,希尔OK
// Select_sort(nums,numsSize); //N^2
// Heap_sort(nums,numsSize);
Quick_sort1(nums,0,numsSize-1);//当有大量重复元素的时候 :时间 N^2
// Merge_sort(nums,numsSize);//ok
// Count_sort(nums,numsSize);//OK
*returnSize = numsSize;
return nums;
}
运行结果
4)计数排序
对应时间复杂度:O(N + rangae)
计数排序是可以跑过去的