在我使用 C++ 向量的快速排序实现中,分区函数是否与使用简单的交换方法相同?
In my quicksort implementation using C++ vectors, is partition function same as using the trivial method of swaps?
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
void quick_sort(vector<int> &a, int start, int end);
int partition(vector<int> &a, int start, int end);
int main(){
vector<int> v = {7, 6, 5, 4, 3, 2, 1};
int n(7);
quick_sort(v, 0, n);
for (auto& itr : v){
cout << itr << ' ';
}
return 0;
}
void quick_sort(vector<int> &a, int start, int end){
if (start < end){
int index;
index = partition(a, start, end);
quick_sort(a, start, index - 1);
quick_sort(a, index, end);
}
}
int partition(vector<int> &a, int start, int end){
int pivot, count(0);
pivot = a[end - 1];
for (int i = start; a[i] != pivot; i++){
if (a[i] > pivot){
a.insert(a.begin()+end, a[i]);
a.erase(a.begin() + i);
count++;
i--;
}
}
return end-count;
}
这里在分区函数中我使用了STL库中提供的插入和擦除函数。
分区函数的时间复杂度会不会大于O(n)(使用swap时的情况)?
根据我的说法,最坏的情况是当枢轴元素是最小元素时,所有 (n-1) 个元素都将被推到向量的末尾。
编辑:
int partition(vector<int> &a, int start, int end){
int pivot;
pivot = end - 1;
for (int i = start; i < end; i++){
if (a[i] > a[pivot] && i < pivot){
swap(a[i], a[pivot]);
pivot = i;
}
else if (a[i] < a[pivot] && i > pivot){
swap(a[i], a[pivot]);
pivot = i;
}
}
return pivot + 1;
}
这个配分函数在 O(n) 时间内运行。
您在 end
之后移动每个元素执行 insert
,在 i
之后移动每个元素执行 erase
。这个版本比交换 差很多。使用 std::swap
,您只需触摸两个元素。
旁白:C++ 中的排序是 traditionally done with iterators,而不是索引,即
using iterator = std::vector<int>::iterator;
void quick_sort(iterator start, iterator end);
iterator partition(iterator start, iterator end);
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
void quick_sort(vector<int> &a, int start, int end);
int partition(vector<int> &a, int start, int end);
int main(){
vector<int> v = {7, 6, 5, 4, 3, 2, 1};
int n(7);
quick_sort(v, 0, n);
for (auto& itr : v){
cout << itr << ' ';
}
return 0;
}
void quick_sort(vector<int> &a, int start, int end){
if (start < end){
int index;
index = partition(a, start, end);
quick_sort(a, start, index - 1);
quick_sort(a, index, end);
}
}
int partition(vector<int> &a, int start, int end){
int pivot, count(0);
pivot = a[end - 1];
for (int i = start; a[i] != pivot; i++){
if (a[i] > pivot){
a.insert(a.begin()+end, a[i]);
a.erase(a.begin() + i);
count++;
i--;
}
}
return end-count;
}
这里在分区函数中我使用了STL库中提供的插入和擦除函数。
分区函数的时间复杂度会不会大于O(n)(使用swap时的情况)?
根据我的说法,最坏的情况是当枢轴元素是最小元素时,所有 (n-1) 个元素都将被推到向量的末尾。
编辑:
int partition(vector<int> &a, int start, int end){
int pivot;
pivot = end - 1;
for (int i = start; i < end; i++){
if (a[i] > a[pivot] && i < pivot){
swap(a[i], a[pivot]);
pivot = i;
}
else if (a[i] < a[pivot] && i > pivot){
swap(a[i], a[pivot]);
pivot = i;
}
}
return pivot + 1;
}
这个配分函数在 O(n) 时间内运行。
您在 end
之后移动每个元素执行 insert
,在 i
之后移动每个元素执行 erase
。这个版本比交换 差很多。使用 std::swap
,您只需触摸两个元素。
旁白:C++ 中的排序是 traditionally done with iterators,而不是索引,即
using iterator = std::vector<int>::iterator;
void quick_sort(iterator start, iterator end);
iterator partition(iterator start, iterator end);