I wrote the below code for merge sort but it's not working, And I am unable to find out problem!
Every time the output becomes same as input, I think that problem may occur due to vector reference.
I think mergeSort is not creating a new vector for sub array. But I am still confused.
input vector: 5, 4, 3, 2, 1
output: 5, 4, 3, 2, 1
Req output: 1, 2, 3, 4, 5
#include <iostream>
#include <vector>
using namespace std;
void merge(vector<int> &la, vector<int> &ra, vector<int> &A) {
int i = 0, j = 0, k = 0;
// overwriting A using its solved sub arrays i.e la, ra
while (i < la.size() && j < ra.size()) {
if (la[i] <= ra[j]) {
A[k] = la[i];
i++;
k++;
} else {
A[k] = ra[j];
j++;
k++;
}
}
// if any subarray left then
while (i < la.size()) {
A[k] = la[i];
k++;
i++;
}
while (j < ra.size()) {
A[k] = ra[j];
k++;
j++;
}
}
mergeSort function:
void mergeSort(vector<int> &A) {
if (A.size() < 2)
return;
int len = A.size();
vector<int> la, ra;
for (int i = 0; i < len / 2; i++)
la.push_back(A[i]);
for (int i = len / 2; i < len; i++)
ra.push_back(A[i]);
// dividing the proble into subproblem
mergeSort(la);
mergeSort(ra);
// merging the solved subproblem
merge(la, ra, A);
}
Driver function:
int main(void) {
int arr[] = { 5, 4, 3, 2, 1 };
vector<int> A(arr, arr + 5);
for (int i = 0; i < A.size(); i++)
cout << A[i] << " ";
cout << endl;
mergeSort(A);
for (int i = 0; i < A.size(); i++)
cout << A[i] << " ";
return 0;
}
The code posted does not seem to have a problem.
Executing it produces the expected output: 1 2 3 4 5, so there is something else going on that could cause your observations: you might be running an executable produced by a previous or at least different version of the code.
Related
i'm trying to make it so if i enter the number 3 , the matrix would change to {1,2,4,5,6,7,8,9,10,11,12,0}, i'm not sure if the method of switching the element between two arrays is the best way to do it and i'm trying to do it using pointers
using namespace std;
#include <iomanip>
int main() {
int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, i, j,c;
int* ptr = &arr[0][0];
int zero[3][4] = { 0,0,0,0,0,0,0,0,0,0,0,0 };
int* zptr = &zero [0][0];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
cout << setw(8) << arr[i][j] << ' ';
}
cout << endl;
cout << ' ' << endl;
}
for (i = 0; i < 3; i++) {
if (arr[i][0] = i)
{
break;
}
for (int j = 0; j < 4; j++)
cin >> i;
cout << ptr;
}
return 0;
}
you could use easier approach to achieve this using vector in c++ and by finding the index of the input element, consider this example :
int getIndex(vector<int> v, int K) {
auto it = find(v.begin(), v.end(), K);
// calculating the index of K
// note that here i'm supposed the input is valid
int index = it - v.begin();
return index;
}
and you can use the index you get to 1) append in A the element B[index], 2) assign B[index] to A[index] and 3) erase the element A[index].
hope this can be helpful.
when i run it it lists all the integers in the array but then it drops the last three and and loops forever. i cant figure it out, some constructive criticism would be appreciated.
#include <iostream>
#include <unistd.h>
int ary[8] = {3, 7, 8, 1, 3, 45, 19};
int len (sizeof(ary)/sizeof(ary[0]));
int right = 1;
int g;
int g2;
int main()
{
while(right != len)
{
for(int i = 0; i <= len; i++)
std::cout << ", " << ary[i];
std::cout << "\n";
usleep(120000);
for(int i = 0; i <= len; i++)
{
if(ary[i] <= ary[i + 1])
{
right++;
}
else
{
g = ary[i];
g2 = ary[i + 1];
ary[i] = g2;
ary[i + 1] = g;
}
}
}
}
so what you have tried to do here looks something like bubble sort.
i have fixed the bugs in your code, here's a working version:
#include <iostream>
#include <unistd.h>
int ary[8] = {3, 7, 8, 1, 3, 45, 19};
int len (sizeof(ary)/sizeof(ary[0]));
int right = 1;
int g;
int g2;
int main()
{
while(right != len)
{
// the value of the variable 'right' needs to be reset to 1 everytime you loop
right = 1;
for(int i = 0; i < len; i++)
std::cout << ", " << ary[i];
std::cout << "\n";
usleep(120000);
// as arrays in c++ are zero-indexed, the last element is index len - 1
for(int i = 0; i < len - 1; i++)
{
if(ary[i] <= ary[i + 1])
{
right++;
}
else
{
g = ary[i];
g2 = ary[i + 1];
ary[i] = g2;
ary[i + 1] = g;
}
}
}
}
there is one thing that really caught my eyes and is really bad practice : the way you swapped variables
// you only need at most 3 variables to swap
g = ary[i];
ary[i] = ary[i+1];
ary[i+1] = g;
// or you can do built-in:
std::swap(ary[i], ary[i+1]);
even though trying to figure stuff out by yourself is good practice and usually helps, in this case I think you should read some documentation.
for reference, this is what a conventional bubble sort looks like:
#include <iostream>
int a[] = {3, 7, 8, 1, 3, 45, 19};
const int len = sizeof(a) / sizeof(int);
int main () {
for (int i=0; i<len; ++i) {
for (int j=i+1; j<len; ++j) {
if (a[i] > a[j])
std::swap(a[i], a[j]);
}
}
for (int i=0; i<len; ++i)
std::cout << a[i] << ' ';
return 0;
}
thanks for your time and good luck coding (:
it goes forever becuase the for-loop will compare the last item i[8] with i[8 + 1] and i[8 + 1] is null
so to solve this problem
for(int i = 0; i < len - 1; i++)
instead of
for(int i = 0; i <= len; i++)
try this:
#include <iostream>
#include <unistd.h>
int ary[8] = {3, 7, 8, 1, 3, 45, 19};
int len (sizeof(ary)/sizeof(ary[0]));
int Round = 0;
int g;
int g2;
int main()
{
while(Round != len)
{
for(int i = 0; i < len; i++)
std::cout << ", " << ary[i];
std::cout << "\n";
usleep(120000);
for(int i = 0; i < len - 1; i++)
{
if(ary[i] <= ary[i + 1])
{
continue;
}
else
{
g = ary[i];
g2 = ary[i + 1];
ary[i] = g2;
ary[i + 1] = g;
}
}
Round++;
}
}
Given an array, I am trying to find the maximum sub-array sum. A sub-array is as follows. For example, I get the following array: [9, -7, 5, 3, 91]. Whilst [9, -7, 5] is a sub-array, [9, 5, 3, 91] is not. My code is below:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int arraylen, subarraylen, subarraysum, itervar1, itervar2, itervar3, incrementvar;
cin >> arraylen;
vector<int> mainarray(arraylen);
vector<int> sumarray(arraylen * (arraylen-1) + 1);
for (itervar1 = 0; itervar1 < arraylen; itervar1++) {
cin >> mainarray[itervar1];
}
sumarray[0] = 0;
for (itervar1 = 0; itervar1 < arraylen; itervar1++) {
for (itervar2 = arraylen; itervar2 > 0; itervar2--) {
subarraylen = itervar2-itervar1;
if (subarraylen < 1) {
continue;
}
vector<int> subarray(subarraylen);
incrementvar = 0;
for (itervar3 = itervar1; itervar3 < itervar2; itervar3++) {
subarray[incrementvar] = mainarray[itervar3];
incrementvar++;
}
subarraysum = 0;
for (itervar3 = 0; itervar3 < subarraylen; itervar3++) {
subarraysum += subarray[itervar3];
}
}
}
return 0;
}
For some reason, it doesn't work; just infinitely loops around. Any help would be appreciated.
First, here is a routine to list all the sub arrays:
vector<int> vec{ 9, -7, 5, 3, 91 };
int sz = vec.size();
for(int start = 0; start < sz; start++)
{
for(int end = start; end < sz; end++)
{
for(int j = start; j <= end; j++)
{
cout << vec[j] << ", ";
}
cout << "\n";
}
}
Now you just have to get the total in loop j, add to a vector sum. You don't need to know the size of sum before hand. Use push_back to add total to sum.
Note, the array itself is included as a sub array, you can exclude that array depending on what the definition is.
I was tinkering with C++ and I was like let's make a sorting algorithm :)
I did something, but it didn't sort the array but instead the array was overwritten with the max number
I don't know where is my mistake because I ran the algorithm on paper (don't ask) and it was correct.
I tried every modification possible.
any help?
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int mn = 0, mx = 0;
int a[] = { 4, 8, 5, 2, 6, 9, 0, 3, 1, 7 };
for (int i = 0; i < 10; i++)
{
mn = a[i]; mx = a[i];
for (int j = i; j < 10 - i; j++)
{
mn = min(a[j], mn);
mx = max(a[j], mx);
}
swap(a[i], mn);
swap(a[10-1-i], mx);
}
for(int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
}
You are not swapping array elements, but basically you write the min/max values to the corresponding places within the array. Their old value is simply overwritten. You need to track the positions of the min/max elements and swap accordingly, e.g. swap(a[i], a[min_pos]). Additionally, you could run your outer loop up until the middle of the array is reached as you put two elements into their place on each iteration.
Here's the working code:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int mn = 0, mx = 0;
int a[] = { 4, 8, 5, 2, 6, 9, 0, 3, 1, 7 };
for (int i = 0; i < 10 / 2; i++)
{
int min_pos = i, max_pos = i;
for (int j = i; j < 10 - i; j++)
{
if (a[j] < a[min_pos]) {
min_pos = j;
} else if (a[j] > a[max_pos]) {
max_pos = j;
}
}
int min_val = a[min_pos];
int max_val = a[max_pos];
swap(a[i], a[min_pos]);
swap(a[10-1-i], a[max_pos]);
a[i] = min_val;
a[10-1-i] = max_val;
}
for(int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
}
Note, you need to take care of 'special cases', e.g. when the min_pos and max_pos are at the ends of the interval - they would be swapped twice staying in their original positions.
Hi when running this small program, I appear to have an output of the memory addresses rather than the values stored inside them: any ideas? thanks.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int a[5] = { 1, 3, 5, 7, 9 };
int b[5] = { 2, 4, 6, 8, 10 };
int c[10] = {};
int j, i;
for(j = 0; j < 10; j++)
{
if (a[j] < b[j])
{
c[j] = a[j];
}
else
{
c[j] = b[j];
}
}
for (i= 0; i < 10; i++)
{
cout << c[i];
}
return 0;
}
Your conditions are wrong. a and b both have size 5, but you are iterating upto size 10.