Quick actions

cmd+k|ctrl+k

Navigation

Languages

Lab Sort Bytes

Snippet info

Language

Cpp

Visibility

public

Author

aldelank

Created

2017-12-27T12:13:13Z

Updated

2017-12-27T16:07:55Z

#include <iostream>
using namespace std;

typedef int (*CompareFunctionType)(void *, void *);
//Теперь переменную это типа можно объявить так:
//CompareFunctionType compare_function_pointer = &Compare;

//В отдельной функции организуйте ввод элементов массива:
void InputIntArray(int input_data[], int length){
    for (int i=0;i<length;i++){
        cin>>input_data[i];
    }
}

void InputCharArray(char my_char_array[], int length){
    for (int i=0;i<length;i++){
        cin>>my_char_array[i];
    }
}

int CompareInt0to9(void *first_pointer, void *second_pointer ) {
    int *first_element_int_pointer = (int *)first_pointer;
    int *second_element_int_pointer = (int *)second_pointer;
    return *first_element_int_pointer - *second_element_int_pointer;
}

int CompareInt9to0(void *first_pointer, void *second_pointer ) {
    int *first_element_int_pointer = (int *)first_pointer;
    int *second_element_int_pointer = (int *)second_pointer;
    return *second_element_int_pointer - *first_element_int_pointer;
}

int CompareCharAtoZ(void *first_pointer, void *second_pointer ) {
    char *first_element_int_pointer = (char *)first_pointer;
    char *second_element_int_pointer = (char *)second_pointer;
    return *first_element_int_pointer - *second_element_int_pointer;
}

int CompareCharZtoA(void *first_pointer, void *second_pointer) {
    char *first_element_int_pointer = (char *)first_pointer;
    char *second_element_int_pointer = (char *)second_pointer;
    return *second_element_int_pointer - *first_element_int_pointer;
}

//В отдельной функции организуйте поиск индекса минимального элемента на подмассиве:
int FindMinimumIndex_old(long input_data[], int first_index, int last_index, CompareFunctionType compare_function_pointer){
    int target=first_index;
    for (int j=first_index;j<last_index;j++){
        if ((*compare_function_pointer)(&input_data[j], &input_data[target])<0) {
            target=j;
        }
    }
    //cout<<target<<endl;
    return target;
}

//В отдельной функции реализуйте обмен элементов массива.
void Swap_old(long &first_element, long &second_element){
    long c=first_element;
    first_element=second_element;
    second_element=c;
}

//В отдельной функции организуйте вывод элементов упорядоченного
//массива:
void OutputIntArray(int input_data[], int length){
    for (int i=0;i<length;i++){
        cout<<input_data[i]<<" ";
    }
    cout<<endl;
}

void OutputCharArray(char input_data[], int length){
    for (int i=0;i<length;i++){
        cout<<input_data[i];
    }
    cout<<endl;
}

///////////////////
void SwapChar(char *first_pointer, char *second_pointer) {
    char temp = *first_pointer;
    *first_pointer = *second_pointer;
    *second_pointer = temp;
    return;
}

void Swap(void *first_pointer, void *second_pointer, int width) {
    for (int byte_number = 0; byte_number < width; ++byte_number) 
        SwapChar((char *)first_pointer + byte_number, (char *)second_pointer + byte_number);
    return;
}

int FindTargetIndex(char *bytevise_array, int width, CompareFunctionType compare_function_pointer, int first_index, int last_index) {
    int target_index = first_index;
    int target_byte_number = target_index * width;
    int current_byte_number = 0;
    for (int element_number = first_index; element_number < last_index; ++element_number) {
        current_byte_number = element_number * width;
        if ((*compare_function_pointer)(&bytevise_array[current_byte_number],&bytevise_array[target_byte_number]) < 0) 
            target_byte_number = current_byte_number;
            //cout<<target_byte_number<<" ";
    }
    //cout<<endl;
    target_index = target_byte_number / width;
    return target_index;
}

//В отдельной функции организуйте сортировку.
void SelectionSort(void *input_data, int width, int length, CompareFunctionType compare_function_pointer){
    char *byte_data=(char *)input_data;
    //OutputIntArray((int *)input_data,length);
    for (int i=0;i<length;i++){
        int target=FindTargetIndex(byte_data,width,compare_function_pointer,i,length);
        //cout<<i<<" "<<target<<" "<<width<<endl;
        Swap(&byte_data[i*width],&byte_data[target*width],width);
        //OutputIntArray((int *)input_data,length);
    }
}

int main() {
    
    int CompareInt0to9(void *first_pointer, void *second_pointer);
    int CompareInt9to0(void *first_pointer, void *second_pointer);
    
    int CompareCharAtoZ(void *first_pointer, void *second_pointer);
    int CompareCharZtoA(void *first_pointer, void *second_pointer);
    
    //Заполнение массивов пропущено...
    //Вызов функции сортировки
    //SelectionSort((void *)my_int_array, kLength, 4, &CompareInt0to9);
   
    
    const int kFunctionsCount = 4;
    //CompareFunctionType compare_function_pointers[kFunctionsCount];
    //compare_function_pointers[0]=CompareInt0to9;
    //compare_function_pointers[1]=CompareInt9to0;
    
    CompareFunctionType compare_function_pointers[kFunctionsCount];
    compare_function_pointers[0]=CompareCharAtoZ;
    compare_function_pointers[1]=CompareCharZtoA;
    compare_function_pointers[2]=CompareInt0to9;
    compare_function_pointers[3]=CompareInt9to0;

    
    int type; cin>>type;
    int n; cin>>n; int m; cin>>m;
    
    char *my_char_array=new char[n];
    int *my_int_array=new int[m];
    
    InputCharArray(my_char_array, n);
    InputIntArray(my_int_array, m);
    
    SelectionSort((void *)my_char_array, sizeof (my_char_array [0]), n, compare_function_pointers[type]);
    SelectionSort((void *)my_int_array, 4, m, compare_function_pointers[type+2]);
    
    OutputCharArray(my_char_array,n);
    OutputIntArray(my_int_array,m);
    return 0;
}
INFO