1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

wtf is wrong with this code???

Discussion in 'C' started by chetan3191, Dec 13, 2011.

  1. chetan3191

    chetan3191 New Member

    Joined:
    Dec 13, 2011
    Messages:
    5
    Likes Received:
    0
    Trophy Points:
    0
    Code:
    #include<stdio.h>
    void quick(int[],int);
    
    main(){
    int a[]={11,2,5,4,7,3};
    int len=sizeof(a)/sizeof(a[0]);
    quick(a,len);
    
    int i=0;
    while(i<len){
    printf("%d,",a[i]);
    i++;
    }
    }
    
    
    
    
    
    void quick(int a[],int len){
    
    int pivot=a[0];
    int loc=0;
    int i=0,j=len-1;
    
    while(i!=j){
    
    while(j>=0 && i!=j ){
    if(a[j]<pivot){
        printf("asdasdad");
    a[loc]=a[j];
    loc=j;
    break;
    }
    j--;
    }
    
    while(a[i]<len && i!=j){
    if(a[i]>pivot){    
    a[loc]=a[i];
    loc=i;
    break;
    }
    i++;
    }
    
    }
    
    a[i]=pivot;
    }
    
    

    copy this code and paste it in ur compiler...this is the first basic quick sort step...for the above given array elements this code goes into infinite loop and i am too stupid to understand the reason behind it.....kindly help me out guyzzz!!
     
    Last edited by a moderator: Dec 14, 2011
  2. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,012
    Likes Received:
    203
    Trophy Points:
    0
    Occupation:
    Senior Support Engineer
    Location:
    England
    Code:
    printf("asdasdad");
    
    Well, you're on the right lines. But maybe you could print out something a bit more useful, say what it's doing and why, and display some variables, and do this in multiple places throughout the function. Then by inspecting the output you can - if you have placed enough debug printfs - find the cause of the problem. All we can tell from the current level of debug is that you're stuck in an infinite loop for some reason.
     
  3. chetan3191

    chetan3191 New Member

    Joined:
    Dec 13, 2011
    Messages:
    5
    Likes Received:
    0
    Trophy Points:
    0
    that
    printf("asdasdad");

    is itself my debugging approach....i just need some1 to explain y it enters the infinite loop....
    change the array elements to int a[]={4,3,2};

    u will find that it gives an output without getting stuck!!

    i'll myself even try to put printfs at various places....
     
  4. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,012
    Likes Received:
    203
    Trophy Points:
    0
    Occupation:
    Senior Support Engineer
    Location:
    England
    >> "asdasdad" is itself my debugging approach

    Yes I know. My point is that it's not sufficient.

    >> .i just need some1 to explain y it enters the infinite loop

    Sorry, the way to debug code is to learn to do it yourself, not just post it online and expect someone else to do it for you. I'll help you solve the problem yourself, but I won't spell it out for you.

    >> 4,3,2 u will find that it gives an output without getting stuck!!

    Yes, that's what makes debugging fun. Why does one array work ok and the other not? Maybe try swapping these around - see if you still get the problem. Does 3,4,2 work? Or add one: does 5,4,3,2 work? And so on.

    >> i'll myself even try to put printfs at various places

    Yep, that's what I do when I can't run the code in a debugger.
     
  5. chetan3191

    chetan3191 New Member

    Joined:
    Dec 13, 2011
    Messages:
    5
    Likes Received:
    0
    Trophy Points:
    0
    in short...i will have to figure it out myself....thanx for the support!!
     
  6. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,012
    Likes Received:
    203
    Trophy Points:
    0
    Occupation:
    Senior Support Engineer
    Location:
    England
    Yes....but I'll help you figure it out for yourself. Post what you've got after you've sprinkled some printfs over the code and what ideas you might have about the cause of the problem.
     
  7. Chong

    Chong New Member

    Joined:
    May 15, 2011
    Messages:
    29
    Likes Received:
    7
    Trophy Points:
    0
    Hi
    It seems that your algorithm for quick sort is wrong. The following is the algorithm for quick sort. I hope this helps.
    Best regards
    Chong
    Code:
    +++++++++++++++++++++++++++++++++++++++++
    // quicksort.cpp
    //
    //		This program shows how to use Quicksort to sort arrays.
    //		Note that pivot in the program is nothing more than a guide!! It
    //		is used just for a comparison!!
    //
    
    #include <stdio.h>
    #include <string.h>
    #include <conio.h> //for getche()
    #include <windows.h>
    #include <winbase.h>
    
    #define		swap(x,y)	{ int t; t=x; x=y; y=t;}
    #define		order(x,y)	if (x > y) swap(x,y)
    #define		O2(x,y)		order(x,y)
    #define		O3(x,y,z)	O2(x,y);O2(x,z);O2(y,z)
    
    typedef enum {yes, no} yes_no;
    
    
    static yes_no find_pivot(int *left, int *right, int *pivot_ptr);
    static int *partition(int *left, int *right, int pivot);
    void quicksort(int *left, int *right);
    
    
    main( )
    {
    	int *p,pivot;
    	int age[5] = {7,2,5,8,9};
    	int len = sizeof(age)/sizeof(int);
    
    	quicksort(age, age+len-1);
    
    	for (int k=0; k<len; k++) {
    		printf("[Age] %d\n", age[k]);
    	} // for
    
    	getche();
    
    } // main
    
    
    void quicksort(int *left, int *right)
    {
    	int *p;
    	int pivot;
    
    	if (find_pivot(left,right,&pivot) == yes) {
    		p = partition(left,right,pivot);
    		quicksort(left, p-1);
    		quicksort(p, right);
    	} // if
    
    } // quicksort
    
    
    
    static yes_no find_pivot(int *left, int *right, int *pivot_ptr)
    {
    	int a,b,c,*p;
    
    	a = *left;
    	b = *( left + (right-left)/2 );
    	c = *right;
    
    	O3(a,b,c);
    
    	if (a < b) {
    		*pivot_ptr = b;
    		return (yes);
    	} // if
    
    	if (b < c) {
    		*pivot_ptr = c;
    		return(yes);
    	} // if
    
    	for ( p = left+1; p <= right; p++) {
    		if (*p != *left) { 	
    			*pivot_ptr = (*p < *left) ? *left: *p;
    			return(yes);
    		} // if
    	} // for
    
    	return(no);
    } // find_pivot
    
    
    static int *partition(int *left, int *right, int pivot)
    {
    	while (left <= right) {
    		while (*left< pivot) ++left;
    		while (*right >= pivot) --right;
    		if (left < right) {
    			swap(*left, *right);
    			++left;
    			--right;
    		} // if
    	} // while
    
    	return(left);
    } // partition
     
    Last edited by a moderator: Dec 24, 2011

Share This Page