Автор Тема: Сортировка. Си  (Прочитано 3197 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Millenia

  • Пользователь
  • **
  • Сообщений: 44
    • Просмотр профиля
Сортировка. Си
« : 08 Февраля 2012, 20:40:31 »
Уааа, уже просто мозги кипят, не знаю что делать :(
Задание:
Сортировать  числовой файл(целые числа) обменной сортировкой, сортировкой вставками . Оценить реальное время на сортировку каждым из методов на текущем компьютере. Количество элементов файла не менее  10000.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include "altconio.h"
//создание массива
void input (FILE *file){
     srand(time(NULL));
     int mas[10000], i;
     file = fopen("~$temp.txt", "wt"); 
     for (i = 0; i < 10000; i++){
         mas[i]=rand()%100;
         fprintf(file, "%d ", mas[i]);}
         fclose(file);
     delay(1000);
     printf("\nМассив сформирован                      \n");
     printf("\n");
     system("pause");}
//вывод массива
void output (FILE *file){
     clrscr();
     printf("\n                                         ");
     printf("\n                                         ");
     printf("\n                                         ");
     printf("\n                                         ");           
     clrscr();
     int mas[10000], i;
     file = fopen("~$temp.txt", "rt");
     while (!feof(file)){
         fscanf (file, "%d ", &mas[i]);
         printf("%d ", mas[i]);}
     fclose(file);
     printf("\n");
     system("pause");}
//вывод массива отсортированного методом обмена     
void output_swap (FILE *file){
     clrscr();
     printf("\n                                         ");
     printf("\n                                         ");
     printf("\n                                         ");
     printf("\n                                         ");           
     clrscr();
     int mas[10000], i;
     file = fopen("sort_swap.txt", "rt");
     while (!feof(file)){
         fscanf (file, "%d ", &mas[i]);
         printf("%d ", mas[i]);}
     fclose(file);
     printf("\n");
     system("pause");}
//вывод массива отсортированного методом вставок
void output_insert (FILE *file){
     clrscr();
     printf("\n                                         ");
     printf("\n                                         ");
     printf("\n                                         ");
     printf("\n                                         ");           
     clrscr();
     int mas[10000], i;
     file = fopen("sort_insert.txt", "rt");
     while (!feof(file)){
         fscanf (file, "%d ", &mas[i]);
         printf("%d ", mas[i]);}
     fclose(file);
     printf("\n");
     system("pause");}
//обменная сортировка
void sort_swap(FILE *file, int *mas){
     clock_t timer;
     timer = clock();
     int i, j, buf=0, m[10000];
     file = fopen("~$temp.txt", "rt");
     for (i=0; i<10000; i++){
        for (j=0; j<10000; j++){
            if (m[j]>m[j+1]){
               buf=m[j];
               m[j]=m[j+1];
               m[j+1]=buf;}}}
     FILE *f = fopen("sort_swap.txt", "wt");
     for (i=0; i<10000; i++){
        fprintf(f, "  %d", m[i]);}
     fclose(file);
     fclose(f);
     timer = clock() - timer;
     printf("\nМассив отсортирован методом сортировки обмена               \n");
     printf("\n Время сортировки = %f сек                                  \n", (double)timer/CLOCKS_PER_SEC);
     system("pause");}
//сортировка вставками
void sort_insert(FILE *file, int *mas){
     clock_t timer;
     timer = clock();
     int i, j, buf=0, m[10000];
     file = fopen("~$temp.txt", "rt");
     for (i=0; i<10000; i++){
        buf = m[i];
        for (j=i-1; j>=0 && m[i]>buf; j--){
           m[j+1]=m[j];}
        m[j+1]=buf;}
     FILE *f = fopen("sort_insert.txt", "wt");
     for (i=0; i<10000; i++){
        fprintf(f, " %d", m[i]);
        fclose(file);}
     timer = clock() - timer;
     printf("\nМассив отсортирован методом сортировки вставками            \n");
     printf("\n Время сортировки = %f сек                                  \n", (double)timer/CLOCKS_PER_SEC);
     system("pause");}
         
void menu_out(int a) {
clrscr();
setcolor(WHITE,BLACK);
         printf("\n");
switch (a) {  // в зависимости от переданного параметра по-разному показывается меню
case 1: setcolor(BLACK,WHITE);  //для выбранного 1-го пункта белый текст на розовом фоне
    printf("Сформировать новый массив\n");
    setcolor(WHITE,BLACK);  // для остальных пунктов - белый текст на черном фоне
printf("Вывод массива на экран\n");
printf("Сортировать массив методом обменной сортировки\n");
printf("Вывод массива отсортированного методом обменной сортировки\n");
printf("Сортировать массив методом сортировкой вставками\n");
printf("Вывод массива отсортированного методом сортировки вставками\n");
printf("Выход\n");
break; // то же самое для остальных пунктов, если они выбраны
case 2: printf("Сформировать новый массив\n");
setcolor(BLACK,WHITE);
printf("Вывод массива на экран\n");
setcolor(WHITE,BLACK);
printf("Сортировать массив методом обменной сортировки\n");
printf("Вывод массива отсортированного методом обменной сортировки\n");
printf("Сортировать массив методом сортировкой вставками\n");
printf("Вывод массива отсортированного методом сортировки вставками\n");
printf("Выход\n");
break;
case 3: printf("Сформировать новый массив\n");
printf("Вывод массива на экран\n");
setcolor(BLACK,WHITE);
printf("Сортировать массив методом обменной сортировки\n");
setcolor(WHITE,BLACK);
printf("Вывод массива отсортированного методом обменной сортировки\n");
printf("Сортировать массив методом сортировкой вставками\n");
printf("Вывод массива отсортированного методом сортировки вставками\n");
printf("Выход\n");
break;
case 4: printf("Сформировать новый массив\n");
printf("Вывод массива на экран\n");
printf("Сортировать массив методом обменной сортировки\n");
setcolor(BLACK,WHITE);
printf("Вывод массива отсортированного методом обменной сортировки\n");
setcolor(WHITE,BLACK);
printf("Сортировать массив методом сортировкой вставками\n");
printf("Вывод массива отсортированного методом сортировки вставками\n");
printf("Выход\n");
break;
    case 5: printf("Сформировать новый массив\n");
printf("Вывод массива на экран\n");
printf("Сортировать массив методом обменной сортировки\n");
printf("Вывод массива отсортированного методом обменной сортировки\n");
setcolor(BLACK,WHITE);
printf("Сортировать массив методом сортировкой вставками\n");
setcolor(WHITE,BLACK);
                                printf("Вывод массива отсортированного методом сортировки вставками\n");
printf("Выход\n");
break;
    case 6: printf("Сформировать новый массив\n");
printf("Вывод массива на экран\n");
printf("Сортировать массив методом обменной сортировки\n");
printf("Вывод массива отсортированного методом обменной сортировки\n");
printf("Сортировать массив методом сортировкой вставками\n");
setcolor(BLACK,WHITE);
                                printf("Вывод массива отсортированного методом сортировки вставками\n");
                                setcolor(WHITE,BLACK);
printf("Выход\n");
break;
    case 7: printf("Сформировать новый массив\n");
printf("Вывод массива на экран\n");
printf("Сортировать массив методом обменной сортировки\n");
printf("Вывод массива отсортированного методом обменной сортировки\n");
printf("Сортировать массив методом сортировкой вставками\n");
                                printf("Вывод массива отсортированного методом сортировки вставками\n");
setcolor(BLACK,WHITE);
printf("Выход\n");
setcolor(WHITE,BLACK);
break;}}
int main(){
    srand(time(NULL));   
    clock_t timer;
   
    int a, vibor = 1, N = 7;
    clrscr();
    printf("\n\n");   
    int mas[10000];
    FILE *file = fopen("~$temp.txt", "wt");   
    if (f == NULL) {
          perror("\nCan't open file:  ");
          getch();
          return 1;}
       
    while (a != 27){ //пока не нажата ESC, если ESC, то программа закончится
          menu_out(vibor);
          a = getch();// узнаем код клавиши
          if (a == 224) a = getch(); // если нажата служебная клавиша, то еще раз getch()   
    switch (a){
           case 13:// если Enter
                switch (vibor){
                     case 1: clrscr(); input(file); clrscr(); break;     
                     case 2: clrscr(); output(file); clrscr(); break;   
                     case 3: clrscr(); sort_swap(file, mas); clrscr(); break;
                     case 4: clrscr(); output_swap(file); clrscr(); break;
                     case 5: clrscr(); sort_insert(file, mas); clrscr(); break;
                     case 6: clrscr(); output_insert(file); clrscr(); break;
                     case 7: a = 27; break;}
           break;   
           case 80:// если ВНИЗ, то vibor либо увеличивается, либо становится равным 1
                   if ( vibor < N ) vibor++;
                   else vibor = 1;
           break;
   
           case 72:// если ВВЕРХ, то vibor либо уменьшается, либо становится равным N, т.е.7
                   if (vibor > 1) vibor--;
                   else vibor = N;
           break;}}
    printf("\n");     
system("pause");   
    return 0;
 }

После обменной сортировки, в файл записывается мусор, не пойму откуда он берется... а сортировка вставками и вовсе походу не работает.
Подскажите, где что не правильно?
Мозг человека обычно загружен лишь на 10% своей мощности; остальное резерв для операционной системы.

 

Сортировка двумерного массива по возрастанию, делфи

Автор Asira

Ответов: 1
Просмотров: 7705
Последний ответ 30 Апреля 2010, 01:39:45
от InfStudent
Сортировка одномерного массива, работаю в VS 2010.

Автор Kaylas

Ответов: 8
Просмотров: 4035
Последний ответ 25 Июля 2010, 18:46:03
от Kaylas
Паскаль, сортировка массива

Автор Solder

Ответов: 3
Просмотров: 4325
Последний ответ 05 Января 2011, 18:43:46
от Solder
Терпеливая сортировка (для с++)

Автор Педусаар

Ответов: 1
Просмотров: 4781
Последний ответ 30 Мая 2010, 01:29:14
от InfStudent