MergeSort giving Segmentation fault - c

I used this merge sort program to create my own program:
https://gist.github.com/mycodeschool/9678029
my program gives me segmentation fault 11. I can't seem to figure out what's wrong. Please help me.
my program:
#include<stdio.h>
int a[20],n, nl, nr,left[20],right[20];
void merge(int *l, int *r, int *x);
void mergesort(int *x, int v);
void main()
{
int i;
printf("Enter the number of the elements \n");
scanf("%d", &n);
printf("Enter the array elements \n");
for(i=0; i<n; i++)
scanf("%d", &a[i]);
printf("The array before sorting: \n");
for(i=0; i<n; i++)
printf("%d \n", a[i]);
mergesort(a,n);
printf("The array after sorting: \n");
for(i=0; i<n; i++)
printf("%d \n", a[i]);
}
void merge(int *l, int *r, int *x)
{
int i=0, j=0, k=0;
while(i<nl && j<nr)
{
if(l[i]<=r[j])
{
x[k]=l[i];
i++;
}
else
{
x[k]=r[j];
j++;
}
k++;
}
while(i<nl)
{
x[k]=l[i];
i++;
k++;
}
while(j<nr)
{
x[k]=r[j];
j++;
k++;
}
}
void mergesort(int *x, int v)
{
int mid,i;
if(n<2)
return;
mid=n/2;
nl=mid;
nr= n-mid;
for(i=0; i<mid; i++)
left[i]=x[i];
for(i=mid; i<n; i++)
right[i-mid]= x[i];
mergesort(left, mid);
mergesort(right,v-mid);
merge(left, right, a);
}
I would really appreciate if someone helped me. Thanks!

here is an example of a merge sort program, easily found via a google of the web.
Some comparison should show you where your code went wrong.
#include<stdio.h>
void mergesort(int a[],int i,int j);
void merge(int a[],int i1,int j1,int i2,int j2);
int main()
{
int a[30],n,i;
printf("Enter no of elements:");
scanf("%d",&n);
printf("Enter array elements:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
mergesort(a,0,n-1);
printf("\nSorted array is :");
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
void mergesort(int a[],int i,int j)
{
int mid;
if(i<j)
{
mid=(i+j)/2;
mergesort(a,i,mid); //left recursion
mergesort(a,mid+1,j); //right recursion
merge(a,i,mid,mid+1,j); //merging of two sorted sub-arrays
}
}
void merge(int a[],int i1,int j1,int i2,int j2)
{
int temp[50]; //array used for merging
int i,j,k;
i=i1; //beginning of the first list
j=i2; //beginning of the second list
k=0;
while(i<=j1 && j<=j2) //while elements in both lists
{
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=j1) //copy remaining elements of the first list
temp[k++]=a[i++];
while(j<=j2) //copy remaining elements of the second list
temp[k++]=a[j++];
//Transfer elements from temp[] back to a[]
for(i=i1,j=0;i<=j2;i++,j++)
a[i]=temp[j];
}

Related

Segmentation fault (core dumped) in C while working with Bucket Sort

I have written a program in C for bucket sort:
#include <stdio.h>
#include <stdlib.h>
#define M 100
void insertion_sort(int arr[], int n){
int i, j, k;
for(i=1;i<n;i++){
j=i-1;
k=arr[i];
while(j>=0 && arr[j]>k){
arr[j+1]=arr[j];
j=j-1;
}
arr[j+1]=k;
}
}
int max(int arr[], int n){
int max=arr[0];
for(int i=0;i<n;i++){
if(arr[i]>max)
max=arr[i];
}
return max;
}
void bucketsort(int arr[], int n){
int i, j, idx=0, *ptr, **bsort;
int len=sizeof(int *)*n+sizeof(int)*n*n;
bsort=(int **)malloc(len);
int len1=n*max(arr, n);
ptr=(int *)malloc(len1*sizeof(int));
for(i=0;i<n;i++){
*(ptr+i)=0;
}
for(i=0;i<n;i++){
int bindex=n*arr[i];
bsort[bindex][*(ptr+bindex)]=arr[i];
*(ptr+bindex)+=1;
}
for(i=0;i<n;i++){
if(*(ptr+i)>0)
insertion_sort(bsort[i], *(ptr+i));
}
for(i=0;i<n;i++){
for(j=0;j<*(ptr+i);j++)
arr[idx++]=bsort[i][j];
}
printf("The sorted array:\n");
for(i=0;i<n;i++){
printf("%d ", arr[i]);
}
}
int main()
{
int arr[M],n,i;
char op[1];
do{
printf("Enter no of elements: ");
scanf("%d",&n);
printf("Enter array elements:\n");
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
bucketsort(arr,n);
printf("\nDo you want to go again?(Y/N):");
scanf("%s", op);
}while(op[0]=='Y');
}
However, when I run the code, and give the necessary input, it gives me:
Segmentation fault (core dumped)
Why is this so? What sort of changes do I have to make in my code?
I've tried debugging on GDB, and it shows an error at the line
bsort[bindex][*(ptr+bindex)]=arr[i];
I don't understand why it should be so, since I have already written a max function for the same.

Junk values when using fixed size array whereas if I use dynamically sized array the results are correct

#include<stdio.h>
void readMatrix(int m,int n,int a[][n]);
void displayMatrix(int m,int n,int a[][n]);
void addMatrix(int m,int n,int a[][n],int b[][n]);
int main()
{
int a[5][5],b[5][5],m,n,p,q;
printf("Enter the no. of rows and columns of matrix A\n");
scanf("%d%d",&m,&n);
printf("Enter the no. of rows and columns of matrix B\n");
scanf("%d%d",&p,&q);
if(m!=p||n!=q)
{
printf("Matrix addition not possible\n");
return 0;
}
printf("Enter %d elements to matrix A\n",m*n);
readMatrix(m,n,a);
printf("Enter %d elements to matrix B\n",m*n);
readMatrix(p,q,b);
printf("Matrix A\n");
displayMatrix(m,n,a);
printf("Matrix B\n");
displayMatrix(p,q,b);
addMatrix(m,n,a,b);
}
void readMatrix(int m,int n,int a[m][n])
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
}
void displayMatrix(int m,int n,int a[m][n])
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}
void addMatrix(int m,int n,int a[m][n],int b[m][n])
{
int c[5][5]; //I guess this is causing problem
//int c[m][n]; //gives correct answer
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
c[i][j]=a[i][j]+b[i][j];
}
}
printf("Sum Matrix\n");
/*Gives correct result
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}
*/
displayMatrix(m,n,c);
}
displayMatrix(m,n,c) is correct If i define array as c[m][n], code for it is given above.
It is giving junk value if I use c[5][5].
I'm using gcc compiler. I displayed the sum in addMatrix function itself, which gives correct result. Not able to figure out the mistake. Kindly help. Thank You.

Error with sorting code in C

I think there was something wrong with the algorithm.
It shows wrong answers.
I changed every line by line, but I didn't get the proper answer.
#include<stdio.h>
void sort(int a[],int n)
{
int gap,i,j,temp;
for(gap=n;gap>0;gap/=2)
{
for(i=gap;i<n;i+=1)
{
temp=a[i];
for(j=i;j>=gap&&a[j]>temp;j=gap)
a[j]=a[j];
a[j]=temp;
}
}
}
int main()
{
int a[20],i,n;
printf("Number of elements:");
scanf("%d",&n);
printf("Enter array elements:\n");
for(i=0;i<n;++i)
scanf("%d",&a[i]);
printf("Array elements before the sort:\n");
for(i=0;i<n;++i)
printf("%d",a[i]);
sort(a,n);
printf("\nAfter sort:\n");
for(i=0;i<n;++i)
printf("%d ",a[i]);
return 0;
}
Please help me with this code.
You're right emely,There were some issues in your algorithm.
In the 6th line the gap should be n/2, not n.
And in the 12th line it should be j-gap.
After correcting those errors,I rewrote the code.
Hope it might help.
Cheers.
#include<stdio.h>
void sort(int a[],int n)
{
int gap,i,j,temp;
for(gap=n/2;gap>0;gap/=2)
{
for(i=gap;i<n;i+=1)
{
temp=a[i];
for(j=i;j>=gap&&a[j-gap]>temp;j-=gap)
a[j]=a[j-gap];
a[j]=temp;
}
}
}
int main()
{
int a[20],i,n;
printf("Number of elements:");
scanf("%d",&n);
printf("Enter array elements:\n");
for(i=0;i<n;++i)
scanf("%d",&a[i]);
printf("Array elements before the sort:\n");
for(i=0;i<n;++i)
printf("%d",a[i]);
sort(a,n);
printf("\nAfter shell sort:\n");
for(i=0;i<n;++i)
printf("%d ",a[i]);
return 0;
}

Merge sort not showing correct output

I have implemented each line of merge sort algorithm-wise and can't find error.
al and ar are left and right sub arrays. Arrays are passed along with size.
#include<stdio.h>
#include<conio.h>
void mergesort(int a[] ,int);
void merge(int al[],int,int ar[],int,int a[]);
int main()
{
int i,n;
printf("Enter the no of elements to be sorted\n");
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
mergesort(a,n);
printf("\nThe elements after sorting are:");
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
getch();
return 0;
}
void mergesort(int a[],int size)
{
int i,n=size,mid;
if(n<2)
return;
mid=n/2;
int left[mid],right[n-mid];
for(i=0;i<mid;i++)
left[i]=a[i];
for(i=mid;i<n;i++)
right[i]=a[i];
mergesort(left,mid);
mergesort(right,n-mid);
merge(left,mid,right,n-mid,a);
}
void merge(int al[],int sl,int ar[],int sr,int a[])
{
int i=0,j=0,k=0;
while(i<sl && j<sr)
{
if(al[i]<=ar[j])
{
a[k]=al[i];
i++;
}
else
{
a[k]=ar[j];
j++;
}
k++;
}
while(i<sl)
{
a[k]=al[i];
i++;
k++;
}
while(j<sr)
{
a[k]=ar[j];
j++;
k++;
}
}
input:
no of elements:4
5 6 3 1
output:
5 16 16 16
Look at this part of your code:
int left[mid],right[n-mid];
for(i=0;i<mid;i++)
left[i]=a[i];
for(i=mid;i<n;i++)
right[i]=a[i];
You are accessing the right array with indexes beyond the array bounds. That should be something like this instead:
right[i - mid]=a[i];
I have correct code for merge sort written in C. Please tally with it.
#include<stdio.h>
void mergesort(int a[],int i,int j);
void merge(int a[],int i1,int j1,int i2,int j2);
int main()
{
int a[30],n,i;
printf("Enter no of elements:");
scanf("%d",&n);
printf("Enter array elements:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
mergesort(a,0,n-1);
printf("\nSorted array is :");
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
void mergesort(int a[],int i,int j)
{
int mid;
if(i<j)
{
mid=(i+j)/2;
mergesort(a,i,mid);
mergesort(a,mid+1,j);
merge(a,i,mid,mid+1,j);
}
}
void merge(int a[],int i1,int j1,int i2,int j2)
{
int temp[50];
int i,j,k;
i=i1;
j=i2;
k=0;
while(i<=j1 && j <=j2)
{
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=j1)
temp[k++]=a[i++];
while(j<=j2)
temp[k++]=a[j++];
for(i=i1,j=0;i<=j2;i++,j++)
a[i]=temp[j];
}

Selection sort on array in C

I'm trying to create a simple(?) selection sort program in C that selects the largest integer of an integer array and places it in the location a[n-1], places the second largest number in a[n-2], etc until the smallest number is placed in a[0]. I've run through the below code on paper and it seems like it should work, but when I compile it I'm getting faulty results. Am I missing something obvious?
/* The program implements selection sort*/
#include <stdio.h>
#include "simpio.h"
#define n 5
void GetArray(int a[]);
void SelectionSort(int a[]);
int FindMax(int a[], int high);
void swap(int a[], int p1, int p2);
void PrintArray(int a[]);
main()
{
int a[n];
GetArray(a);
SelectionSort(a);
PrintArray(a);
getchar();
}
void GetArray(int a[])
{
int i;
for(i=0;i<n;i++)
{
printf("Enter integer# %d", i+1);
a[i]=GetInteger();
}
}
void SelectionSort(int a[])
{
int i, max;
for(i=0;i<n;i++)
{
max=FindMax(a,i);
swap(a,max,(n-1-i));
}
}
int FindMax(int a[], int high)
{
int i, index;
index=high;
for(i=high;i<n;i++)
{
if(a[i]>a[index])
index=i;
}
return index;
}
void swap(int a[], int p1, int p2)
{
int temp;
temp=a[p2];
a[p2]=a[p1];
a[p1]=temp;
}
void PrintArray(int a[])
{
int i;
for(i=0;i<n;i++)
printf("a[%d]=%d\n", i, a[i]);
}
Change these method to:
void SelectionSort(int a[])
{
int i, max;
for(i=0;i<n;i++)
{
max=FindMax(a,n-i-1);
swap(a,max,n-i-1);
}
}
int FindMax(int a[], int high)
{
int i, index;
index=high;
for(i=0;i<high;i++)
{
if(a[i]>a[index])
index=i;
}
return index;
}
I actually tested my answer and it works.
Selection sort is process of comparing minimum element from the list and placing from the least index.
Now consider below code snippet.
public void selectionSort(int[] elements) {
for(int i=0;i<elements.length;i++) {
int minPosition = i;
for(int j=i+1;j<elements.length;j++) {
if(elements[minPosition]>elements[j])
minPosition = j;
}
int temp = elements[i];
elements[i] = elements[minPosition];
elements[minPosition] = temp;
}
}
Thanks for reading, let me know feedback to improve from myside
Shouldn't:
max=FindMax(a,i);
swap(a,max,(n-1-i));
Be:
max=FindMax(a,i);
swap(a,max,i);
otherwise, next time through the loop, you'll find the same max value in the top position in the array.
A very basic implementation of selection sort
#include<stdio.h>
main()
{
int i,j,n=7,a[]={1,2,5,3,8,9,5},key;
for(j=1;j<n;j++)
{
key=a[j]; //a[j] is the new element to be added to the sorted
//sequence
i=j-1;
while(i>=0 && key<a[i]) //traverse through the sorted sequence
{a[i+1]=a[i];i--;} //until the place of key is found
a[i+1]=key;
}
for (j=0;j<n;j++)
printf("%d",a[j]);
}
#include<stdio.h>
#include<conio.h>
int removex(int arr[],int small,int n)
{
int i=0;
for(;i<n;i++)
if(arr[i]==small) //searching that no to delete
break;
for(;i<n-1;i++)
arr[i]=arr[i+1]; //delete by overloading no
return n-1;
}
void selectSort(int arr[],int sort[],int n)
{
int j=0,k=0,small;
while(n!=0)
{
small=arr[0];
for(j=0;j<n;j++)
if(arr[j]<small)
small=arr[j]; //finding smallest no
sort[k++]=small;
n=removex(arr,small,n); //removing that from list as we included that no into sorted list
}
}
void main()
{
int arr[10],arr2[10],i,n;
clrscr();
printf("Enter how many elements");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&arr[i]);
selectSort(arr,arr2,n);
printf("sorted list is\n");
for(i=0;i<n;i++)
printf("%d\n",arr2[i]);
getch();
}

Resources