题解
方法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,通过随机选取一个数据作为末端数据解决这个问题