多种方法求解数组排序

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇: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)

计数排序是可以跑过去的

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值