void string_sort(std::vector<light_string>& data, const std::int64_t lo, const std::int64_t hi, const size_t pos) { if (hi <= lo) return; const auto part = string_partition(data, static_cast<size_t>(lo), static_cast<size_t>(hi), pos); const auto less_last_index = part.first; const auto greater_first_index = part.second; std::future<void> future_less = run_async_sort(data, lo, less_last_index, pos); std::future<void> futute_greater = run_async_sort(data, greater_first_index, hi, pos); if (!future_less.valid()) string_sort(data, lo, less_last_index, pos); if (!futute_greater.valid()) string_sort(data, greater_first_index, hi, pos); // This partition is not empty and if strings are not finished // (by length, which means that get_char returns -1) yet, continue sorting by next symbol if (data[static_cast<size_t>(less_last_index + 1)].get_char(pos) >= 0) string_sort(data, less_last_index + 1, greater_first_index - 1, pos + 1); if (future_less.valid()) future_less.wait(); if (futute_greater.valid()) futute_greater.wait(); }
void file_sort(const std::string& in_filename, const std::string& out_filename) { const std::uint64_t SPLIT_SIZE = 1024ULL * 1024 * 1024; file_reader in(in_filename); buffer buf(SPLIT_SIZE); size_t tmp_file_num = 0; std::vector<std::string> created_files; buffer_parser parser; while (!in.eof() || !buf.empty_to_read()) { in.read(buf); if (buf.empty_to_read()) break; buf.terminate_with_newline_if_necessary(); auto strings = parser.parse(buf); string_sort(strings); const auto tmp_file_name = in_filename + ".tmp." + std::to_string(tmp_file_num++); created_files.push_back(tmp_file_name); file_writer out(tmp_file_name); for (const auto& s : strings) out.write(s); buf.move_data_to_begin(); } impl::merge_sorted_files(out_filename, created_files); }
inline typename boost::enable_if_c< is_same<typename std::iterator_traits<RandomAccessIter>::value_type, typename std::string>::value || is_same<typename std::iterator_traits<RandomAccessIter>::value_type, typename std::wstring>::value, void >::type spreadsort(RandomAccessIter first, RandomAccessIter last) { string_sort(first, last); }
int main() { int i, j, arraySize, word_sum; long long total=0; arraySize = string_sort(); for(i=0; i < arraySize; i++){ for(j=0,word_sum=0; names[i][j] != '\0'; j++) word_sum += (names[i][j] - 'A' + 1); total += (word_sum * (i+1)); } printf("%lld",total); return 0; }
int main(int argc, char** argv) { char temp_char=0; srand(time(NULL)); int i=0,j=0; for (i=0;i<char_amount;i++)//Задание 1. Вывод таблицы символов-кодов. { printf("%c ",temp_char); temp_char++; } printf("\n-----------------------\n"); //Задание 3. Сортировка строк. char **mas_string; // Создаем двумерный массив char'ов- массив строк. mas_string=(char**)malloc(string_amount*sizeof(char));// Выделяем под это память. for(i=0;i<string_amount;i++) mas_string[i]=(char*)malloc(char_amount*sizeof(char)); //Заполняем его случайными значениями. for (i=0;i<string_amount;i++) for (j=0;j<char_amount;j++) { mas_string[i][j]=20+rand()%(char_amount-20); } for (i=0;i<string_amount;i++)// Выводим эти значения. { printf("\n-------String#%d-----------\n",i); char_out(mas_string[i],char_amount); } // Вызываем ф-цию сортировки. string_sort(mas_string); //Выводим отсортированные строки for (i=0;i<string_amount;i++) { printf("\n-------Sorted string#%d-----------\n",i); char_out(mas_string[i],char_amount); } // Освобождаем память, выделенную под двумерный массив. for(i=0;i<string_amount;i++) free(mas_string[i]); free(mas_string); return 0; }
char * list_dirs(char *prefix, int n, char **dirs, int *need_newline) { char *e, *e_save = NULL; int i; string_sort(n, dirs); for (i = 0; i < n; i++) { if (*need_newline) { printf("\n"); *need_newline = 0; } printf("%s%s:\n", prefix, dirs[i]); e = list_dir(prefix, dirs[i], need_newline); *need_newline = 1; if (e_save == NULL) e_save = e; } return (e_save); }