【算法笔记】不用库函数手撕力扣之力扣912:排序数组

题目链接

题解

方法1:数组标注

主要思路

用的快排算法,主要思路,首先将数组构建成一种情况:以某个位置为分界点,左边的数据都比分界点小,右边的数据都比分界点大,然后递归处理左右两边的数据即可。

源代码
python实现
class Solution(object):
    def sortArray(self, nums):
        if len(nums) == 1 or len(nums) == 0:
            return nums;
		# 避免有序数组复杂度增高,这里对最后一个数进行随机替换
        randIndex = random.randint(0,len(nums) - 1)
        endIndex = len(nums) - 1;
        temp = nums[endIndex]
        nums[endIndex] = nums[randIndex]
        nums[randIndex] = temp

        midIndex = -1;  # 保证midIndex及midIndex左边的数据都比本数组最后一个数要小
        
        for searchIndex in range(len(nums) - 1):
            # 把比endIndex小的数全都移动到midindex左边
            if(nums[searchIndex] < nums[endIndex]):
                temp = nums[searchIndex]
                nums[searchIndex] = nums[midIndex + 1]
                nums[midIndex + 1] = temp
                midIndex = midIndex + 1

        # 把midIndex + 1处的数据和endIndex数据进行交换
        # 这样保证了交换后的数据中,以midIndex+1为节点,它左边的数据都比它小,右边的数都比它大。
        temp = nums[midIndex + 1]
        nums[midIndex + 1] = nums[endIndex]
        nums[endIndex] = temp
        midIndex = midIndex + 1
        midNum = nums[midIndex]

        # 用分治的思想,分别用上述快排的思想midIndex左边和右边的数据(左右两边的数组会被无限分割,直到长度为1或者为0),最终就得到了一个整个的有序数组
        if midIndex > 0:
            left = self.sortArray(nums[0:midIndex])
        else:
            left = []

        if midIndex < endIndex:
            right = self.sortArray(nums[midIndex + 1:endIndex + 1])
        else:
            right = []

        left.append(midNum)
        left = left + right

        return left
C语言实现版本
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

void fastSort(int* data, int startIndex, int endIndex)
{
	if (endIndex == startIndex)
		return;

    int tempIndex = (startIndex + endIndex)/2;
    int temp = data[tempIndex];
    data[tempIndex] = data[endIndex];
    data[endIndex] = temp;

	int midIndex = startIndex - 1; //midIndex左边的数据都是比最后一个数据小的数
	for (int i = startIndex; i < endIndex; i++)
	{
		if (data[i] < data[endIndex])
		{
			midIndex++;
			int temp = data[i];
			data[i] = data[midIndex];
			data[midIndex] = temp;
		}
	}

	midIndex++;
	temp = data[midIndex];
	data[midIndex] = data[endIndex];
	data[endIndex] = temp;
	
	if(midIndex - startIndex > 1)
	{
		fastSort(data, startIndex, midIndex - 1);
	}

	if (endIndex - midIndex > 1)
	{
		fastSort(data, midIndex + 1, endIndex);
	}
}


int* sortArray(int* nums, int numsSize, int* returnSize){
    fastSort(nums, 0, numsSize - 1);
    *returnSize = numsSize;

    return nums;
}

时空复杂度
  • 用时:执行用时:544 ms, 在所有 Pyhton 提交中击败了10.2%的用户
  • 内存:22.2 MB, 在所有 Python 提交中击败了74.2%的用户
中途错误记录
  • 第一次: 寻找完中值后,保存中值的变量midNum保存成了末端变量,主要原因是变量名与其功能不符合,midNum=temp改为midNum = nums[midIndex]
  • 第二次:对于原本有顺序的数组排序效率过低,复杂度为n^2,通过随机选取一个数据作为末端数据解决这个问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值