[英]How to write the algorithm of Selection Sort for sorting list of elements in descending order using cpp?
[英]Sorting vectors in a descending order using the quicksort algorithm
我是快速排序算法的新手。 遵循此處描述的原則“理解快速排序” 。 我嘗試編寫用於對向量進行降序排序的quicksort代碼。 下面是我的代碼和一個簡單的示例:
#include <iostream>
#include <vector>
using namespace std;
void quick_sort(vector<int> vec, int begin, int end)
{
int i; //for left element index
int j; //for right element index
int pivot_idx = (begin+end)/2;
int pivot = vec[pivot_idx]; //pivot element
//cout<<"Pivot = "<<pivot<<endl;
i = begin;
j = end;
//partition data into smaller and larger parts relative to the pivot
while(1)
{
while(vec[i]>pivot)
{
++i;
}
while(vec[j]<pivot)
{
++j;
}
//Once the left index pass right index, partitioning is done
if(i>=j)
{
break;
}
//otherwise do swapping
int temp;
temp = vec[i];
vec[i] = vec[j];
vec[j] = temp;
//keep moving indices
i++;
j--;
}
//recurse into two smaller parts
if(begin<i-1)
{
quick_sort(vec, begin, i-1);
}
if(j+1<end)
{
quick_sort(vec, j+1, end);
}
}
int main()
{
vector<int> v;
v.push_back(9);
v.push_back(5);
v.push_back(2);
v.push_back(6);
v.push_back(1);
v.push_back(11);
v.push_back(3);
cout<<"Before sorting:"<<endl;
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<endl;
}
quick_sort(v,0,v.size()-1);
cout<<"After sorting:"<<endl;
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<endl;
}
return 0;
}
上面的代碼無法正常工作。 不執行排序。 我需要一些幫助來調試我的代碼以找出原因。 謝謝!
您正在按值傳遞向量,因此您對原始向量的副本進行了排序。 而是通過引用傳遞它,即將簽名更改為
void quick_sort(vector<int>& vec, int begin, int end)
^^^
更新j
索引有一個錯誤:
while(vec[j]<pivot){++j;}
應該
while(vec[j]<pivot){--j;}
除了通過引用傳遞以外,還有一些其他錯誤,我主要是通過使此實現更簡單來解決的。 您的功能正在嘗試執行所有操作,但未給出正確的結果。 我將分區和交換拆分為各自的功能,並使用了非常標准的quicksort功能。 現在似乎可以正常工作了:
#include <iostream>
#include <vector>
using namespace std;
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition (vector<int> &vec, int l, int h) {
int x = vec[h];
int i = (l - 1);
for (int j = l; j <= h- 1; j++) {
if (vec[j] <= x) {
i++;
swap (&vec[i], &vec[j]);
}
}
swap (&vec[i + 1], &vec[h]);
return (i + 1);
}
void quick_sort(vector<int> &vec, int begin, int end) {
if (begin < end) {
int pivot_idx = partition(vec, begin, end);
quick_sort(vec, begin, pivot_idx-1);
quick_sort(vec, pivot_idx+1, end);
}
}
int main() {
vector<int> v;
v.push_back(9);
v.push_back(5);
v.push_back(2);
v.push_back(6);
v.push_back(1);
v.push_back(11);
v.push_back(3);
cout<<"Before sorting:"<<endl;
for(int i=0;i<v.size();i++) {
cout<<v[i]<<endl;
}
quick_sort(v,0,v.size()-1);
cout<<"After sorting:"<<endl;
for(int i=0;i<v.size();i++) {
cout<<v[i]<<endl;
}
return 0;
}
我希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.