2017-11-23 6 views
4

Ich machte dieses Programm, int-Array als Eingabe zu nehmen und es mit Schnellsortierung zu sortieren, aber ich fragte mich, wie würde ich dieses Programm ändern, das char [] nimmt [] als Eingabe (String-Array) und sortieren sie alphabetisch? Es funktioniert, wenn Theres nur eine Saite, aber ich möchte wissen, was passiert, wenn jemand will Array von StringsKonvertieren von Benutzereingabe von int [] nach char [] []

//following program sorts an array using quicksort alorithm 

#include<iostream.h> 
#include<conio.h> 

void swap(int *a, int *b) //function to swap elements 
{ 
    int t; 
    t = *a; 
    *a = *b; 
    *b = t; 
} 

int partition(int arr[], int left, int right) //function takes last element as pivot and places all smaller elements on left of pivot and greater elements on right 
{ 
    int pivot=arr[right]; //Pivot 
    int i= (left-1);  //index of smaller element 

    for(int j=left; j<=(right-1); j++) 
    { 
     if(arr[j]<=pivot)   //if current element is smaller or equal to pivot, theyre swapped 
     { 
      i++; 
      swap(&arr[i], &arr[j]); 
     } 
    } 
    swap(&arr[i+1], &arr[right]); 
    return (i+1); 
} 

void quicksort(int arr[], int left, int right) //left is starting index, right is last index 
{ 
    if(left<right) 
    { 
     int index=partition(arr,left,right); 
     quicksort(arr, left, index-1);  //sort elements before and after partition 
     quicksort(arr, index+1, right); 
    } 
} 

void print(int *arr, int size)  //function to print elements in array 
{ 
    for(int i=0; i<size; i++) 
    { 
     cout<<arr[i]<<" "; 
    } 
} 

int main() 
{ 
    int n;  //to store no. of elements in array 
    char ch; //ch for choice 
    do{ 
     int *arr=NULL;  //dynamic int array 
     clrscr(); 
    cout<<"\nEnter Number of Elements:"; 
    cin>>n; 
    cout<<"\nEnter Elements in Array to be sorted:"; 
    for(int i=0; i<n; i++) 
    { 
     cout<<"\nEnter "<<i<<"th element:"; 
     cin>>arr[i]; 
    } 
    quicksort(arr,0,(n-1)); 
    cout<<"\nSorted Array= "; 
    print(arr,n); 
    delete arr; 
    cout<<"\nwanna sort again??(y/n):"; 
    cin>>ch; 
    }while(ch=='Y'||ch=='y'); 
    return 0; 
} 
+1

Um Zeichenketten zu vergleichen, sollten Sie 'strcmp()' oder ähnliches verwenden. Sie können immer noch zwei 'char *' so einfach austauschen, wie Sie 'int' austauschen (Zeiger sind einfache Typen wie Integer). Übrigens, dein Compiler ist uralt. Bitte, bitte upgrade auf etwas, das mindestens C++ 14 unterstützt. Sowohl MinGW/GCC als auch Microsofts Compiler können kostenlos verwendet werden. –

+2

In C++ sollten Sie 'std :: string' anstelle von' char [] 'Arrays verwenden. – Barmar

+0

@Barmar, dies ist die alte Version von C++, es unterstützt keine Strings –

Antwort

2

Der Integer-Version in Ihrem Code muss int *arr = new int[n]; Array von ganzen Zahlen zuzuordnen.

Um dies mit einem Array von Strings zu tun, deklarieren Sie char **arr = new char*[n]; und verwenden Sie strdup, um jedem String ein char-Array zuzuordnen.

Sie sollten den Standard qsort in älteren Compilern verwenden können, ansonsten verwenden Sie diese modifizierte Version Ihres Quicksort. Der Hauptunterschied ist der Ersatz von if(arr[j]<=pivot){} mit if(strcmp(arr[j], pivot) <= 0){}

void swap(char* &a, char* &b) 
{ 
    char *t = a; 
    a = b; 
    b = t; 
} 

int partition(char** arr, int lo, int hi) 
{ 
    int i = lo - 1; 
    for(int j = lo; j < hi - 1; j++) 
    { 
     if(strcmp(arr[j], arr[hi]) < 0) 
     { 
      i++; 
      swap(arr[i], arr[j]); 
     } 
    } 

    if(strcmp(arr[hi], arr[i + 1]) < 0) 
     swap(arr[hi], arr[i + 1]); 

    return i + 1; 
} 

void quicksort(char** arr, int const lo, int const hi) 
{ 
    if(lo < hi) 
    { 
     int p = partition(arr, lo, hi); 
     quicksort(arr, lo, p); 
     quicksort(arr, p + 1, hi); 
    } 
} 

void print(char **arr, int size)  
{ 
    for(int i = 0; i<size; i++) 
     cout << arr[i] << ", "; 
    cout << "\n"; 
} 

int main() 
{ 
    int n;  
    cout << "Enter Number of Elements: "; 
    cin >> n; 
    cout << "Enter Elements in Array to be sorted:\n"; 

    char buf[255]; 

    char **arr = new char*[n]; 
    for(int i = 0; i < n; i++) 
    { 
     cout << "Enter " << i << "th element: "; 
     cin >> buf; 
     arr[i] = strdup(buf); 
    } 

    quicksort(arr, 0, (n - 1)); 
    cout << "Sorted:\n"; 
    print(arr, n); 
    cout << "\n"; 

    for(int i = 0; i < n; i++) 
     free(arr[i]); //<=== edit** 
    delete[]arr; 

    return 0; 
} 

Edit 1: quicksort geändert Funktion
Edit 2: die Bereinigung verändert. strdup muss bereinigt werden mit free

+2

Ich glaube, da war ein Fehler mit 'qicksort', ich habe den Code geändert. –

Verwandte Themen