Example #1
0
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();
}
Example #2
0
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);
}
Example #3
0
 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);
 }
Example #4
0
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;
}
Example #5
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;
}
Example #6
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);
}