bubble sort a character array in alphabetic order in c

前端 未结 5 450
眼角桃花
眼角桃花 2020-12-22 05:24

I\'m trying to bubble sort a character array in alphabetic order. My code is as follows:

#define CLASS_SIZE 10
#include 

void bubbleSortAWrit         


        
相关标签:
5条回答
  • 2020-12-22 05:40

    Fixing your code

    First of all, there are some pretty serious fundamental issues with your code. Before we tackle those though, let's just fix what you have so far. Your sorting loop seemed to be half sorting the a array and half sorting the b array. you also never initialized the b array to contain any values. Here is a corrected version of your code:

    #define CLASS_SIZE 10
    #include <stdio.h>
    
    void bubbleSortAWriteToB(const char a[], char * b[]);
    
    int main(void){
        int i;
    
        // initialize array
        char * s_letters[CLASS_SIZE];
        char letters[CLASS_SIZE] = {'a','r','p','b','r','c','x','e','w','j'};
        // sort array
        bubbleSortAWriteToB(letters,s_letters);
    
        // print sorted array
        for (i=0;i<CLASS_SIZE;i++){
            printf("%c\n", *s_letters[i]);
        }
    
        return 0;
    }
    
    void bubbleSortAWriteToB(const char a[], char * b[]){
        char * temp;
        int i,j;
    
        // initialize b array to hold pointers to each element in a
        for (i=0;i<CLASS_SIZE;i++){
            b[i] = (char *)(a) + i;
        }
    
        // in-place sort the b array
        for(i=0;i<CLASS_SIZE;i++){
            for(j=i+1;j<CLASS_SIZE-1;j++){
                if(*b[j-1]>*b[j]){
                    temp = b[j];
                    b[j] = b[j-1];
                    b[j-1] = temp;
                }
            }   
        }
    }
    

    The fix was to initialize the b array with points to a, and then sort the b array in-place by comparing the corresponding values in the a array.


    Simplifying the code

    In your original code, the strategy was to have an array of pointers (b) that would point to the elements in a, and then get sorted. This was unnecessary here though, because characters are smaller than pointers, so letting b be an array of characters is more space-efficient and simpler.

    Also, your spacing was very squished-together and somewhat difficult to read. Here's a solution that uses b as an array of characters instead of pointers, and offers improved spacing. Also, declaring the function above was not necessary. It suffices to define the function and declare it once.

    #define CLASS_SIZE 10
    #include <stdio.h>
    
    void bubbleSortAWriteToB(const char a[], char b[]){
        char temp;
        int i,j;
    
        // initialize b array to hold pointers to each element in a
        for (i = 0; i < CLASS_SIZE; i++){
            b[i] = a[i];
        }
    
        // in-place sort the b array
        for(i = 0; i < CLASS_SIZE; i++){
            for(j = i + 1; j < CLASS_SIZE - 1; j++){
                if(b[j-1] > b[j]){
                    temp = b[j];
                    b[j] = b[j-1];
                    b[j-1] = temp;
                }
            }   
        }
    }
    
    int main(void){
        int i;
    
        // initialize array
        char s_letters[CLASS_SIZE];
        char letters[CLASS_SIZE] = {'a','r','p','b','r','c','x','e','w','j'};
    
        // sort array
        bubbleSortAWriteToB(letters, s_letters);
    
        // print sorted array
        int i;
        for (i = 0; i < CLASS_SIZE; i++){
            printf("%c\n", s_letters[i]);
        }
    
        return 0;
    }
    
    0 讨论(0)
  • 2020-12-22 05:43

    Your s_letters is not properly initialized, yet you access it in:

    *b[j] = a[j-1];
    *b[j-1] = temp;
    

    It's a segfault.

    0 讨论(0)
  • 2020-12-22 05:59

    I compiled this with gcc -g and ran it through Valgrind, and got this:

    ==54446==  Non-existent physical address at address 0x100000000
    ==54446==    at 0x100000EB0: bubbleSortAWriteToB (x.c:20)
    ==54446==    by 0x100000DFE: main (x.c:9)
    

    Line 20 is this:

    *b[j] = a[j-1];
    

    char *b[] is an array of char pointers, but you're trying to put something in the pointers without initializing them. If you really want to do this, you'd need to:

    b[j] = malloc(sizeof(*b[j])); // Create some space for a char
    *b[j] = a[j-1]; // Put the char in that space
    

    But, I don't think that's what you actually want. If you just change it to char b[], and remove all of your *'s, it works fine.

    0 讨论(0)
  • 2020-12-22 06:04
    #include<iostream>
    using namespace std;
    int main(){
    cout<<"Enter the size of array";
    int n;
    cin>>n;
    cout<<"enter elements";
    char arr[n];
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    for(int i=0;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            if(arr[i]<arr[j]){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
     }
    cout<<"sorted array in descending ";
    for(int i=0;i<n;i++){
        cout<<arr[i]<<" ";
    }
    }
    
    0 讨论(0)
  • 2020-12-22 06:05

    Bubble sort

    Console: Input: "face321" OutPut: "123acef"

        #include <stdio.h>
    
    int main(){
    
        char c[80] = "0";
    char temp = '0';
    int offSet = 0;
    int i = 0;
    int j =0;
    int count =0;
    
    printf("Enter first string: ");
    gets(c);
    
    while (*(c + offSet) != '\0') {
        count++;
        offSet++;
    }
    
    
    
    for (i = 0; i < count; i++) {
    for (j = 0; j < count - 1; j++) {
    
    
        if (c[j]>c[j + 1]) {
    
            temp = c[j];
            c[j] = c[j + 1];
            c[j + 1] = temp;
    
        }
    
    }
    
    }
        puts(c);
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题