题目:
实现快排。
链接:
剑指Offer(第2版):P80
思路标签:
算法:递归
解答:
1. C++
- 快排是基于递归操作实现的;
- 首先从数组中随机选择一个数作为基准,与末尾的元素进行交换,放到最后一个元素的位置,方便后期比较操作;
- 设置一个小于基准和大于基准的边界,边界一直为小于基准的最后一个数,初始设置为start-1;
- 遍历数组,小于基准的数则交换放到边界的前面,大于基准的数则可以不变;
- 将基准放到中间位置;
- 上面的步骤为一次实现,称为分区(partition)操作;
- 递归地实现左、右两个子数组的分区操作,则最终实现排序。
- 时间复杂度:最差情况O(n^2),最佳情况O(nlogn),平均情况O(nlogn)
void swap(int* data, int i, int j){
if(i == j) return;
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
// 分区操作
int partition(int data[], int length, int start, int end){
if(data == nullptr || length <= 0 || start < 0 || end >= length)
throw new std::exception("Invalid Parameter");
int index = rand() % (end - start + 1) + start; // 随机选择基准
swap(data, index, end);
int small = start - 1;
for(index = start; index < end; ++index){
if(data[index] < data[end]){
++small;
if(small != index)
swap(data, small, index);
}
}
++small;
swap(data, small, end);
return small;
}
void quickSort(int data[], int length, int start, int end){
if(start == end) return;
int index = partition(data, length, start, end);
if(index > start)
quickSort(data, length, start, index-1);
if(index < end)
quickSort(data, length, index+1, end);
}
2. python
def quick_sort(lists, left, right):
# 快速排序
if left >= right:
return lists
key = lists[left]
low = left
high = right
while left < right:
while left < right and lists[right] >= key:
right -= 1
lists[left] = lists[right]
while left < right and lists[left] <= key:
left += 1
lists[right] = lists[left]
lists[right] = key
quick_sort(lists, low, left - 1)
quick_sort(lists, left + 1, high)
return lists
排序相关
python:
动态图:
其他相关问题
题目: 公司员工年龄排序
几万名员工,实现排序算法,要求时间效率O(n),可以使用常量大小辅助空间,不超过O(n)。年龄范围在0~99之间。
分析:
- 要求时间效率为O(n),所以这也说明了需要使用额外的空间才能实现。
- 题目中仅要求对员工的年龄进行排序即可。
void sortAges(int ages[], int length){
if(ages == nullptr || length <= 0) return;
const int oldestAge = 99;
int timesOfAge[oldestAge + 1];
for(int i=0; i<=oldestAge; ++i)
timesOfAge[i] = 0;
for(int i=0; i<length; ++i){
int age = ages[i];
if(age < 0 || age > oldestAge)
throw new std::exception("Age of out range!");
++timesOfAge[age];
}
int index = 0;
for(int i=0; i<=oldestAge; ++i){
for(int j=0; j<timesOfAge[i]; ++j){
ages[index] = i;
++index;
}
}
}