ページ 11

クイックソートについて

Posted: 2019年7月11日(木) 09:47
by kazukazukazu
大学の課題で、クイックソートを使ってテキストファイル内の数値昇順に並び替え、別のファイルに出力するという問題が出ました。sort_main関数でどうしてもエラーが起きてしまうのですが、どう直せばいいでしょか。

コード:

include <stdio.h>
#include <time.h>


// 定数宣言
#define  COUNT  100000         		// データ数を指定
#define  INFILE    "08sort.txt"		// 入力ファイルを指定
#define  SORTFILE  "out1.txt"   		// 出力ファイルを指定



void sort_main(int *array);
void getFile(int *);
void outFile(int *);
double getFuncTime(clock_t, clock_t);


// ソート(並び替え)メイン関数
void sort_main(int *array){  
    int *left;
    int *right; 
    int mid=array[left],i=left+1,j=right;
    for(;;){
      while(i<j && array[i] <=mid )i++;
      while(array[j] > mid)j--;
      if(i>j || array[i] == array[j])break;
      swap(i,j);
    } 
    swap(left,j);
    if(left<j-1)quick_sort(array,left,j-1);
    if(j+1<right)quick_sort(array,j+1,right);
    }



// プログラムのメイン関数
int main(){
    // 変数宣言
    clock_t start,end;      // 開始&終了時間を格納
    int data[COUNT];        // ファイル内のデータを格納
    
    // ファイル からデータの読み込み
    getFile(data);

    // 処理時間の設定
    start = clock();

    // ソート関数の呼び出し
    sort_main(data);

    // 処理時間の設定
    end = clock();

    /// 処理にかかった時間の出力
    printf("--- Sort Time is  %.2f sec. ---\n", getFuncTime(start, end));

    // 配列に保存されたデータの格納
    outFile(data);
}


void getFile(int *cur){
    FILE *fp;

    fp = fopen(INFILE, "r");
    while(fscanf(fp,"%d", cur) != EOF){
        cur++;
    }

    fclose(fp);
}

void outFile(int *cur){
    FILE *fp;
    int i;

    fp = fopen(SORTFILE, "w");
   
    for(i=0; i<COUNT; i++){
        fprintf(fp, "%d\n", *(cur+i));
    }

    fclose(fp);
} 


double getFuncTime(clock_t start, clock_t end){
    return (double)(end-start)/CLOCKS_PER_SEC;
}

Re: クイックソートについて

Posted: 2019年7月11日(木) 11:01
by Math
一番頭に # がぬけてるのはご愛嬌としても

コード:

void sort_main(int *array){  
    int *left;
    int *right; 
    int mid=array[left],i=left+1,j=right;
 int *left;
int *right;
  int mid=array[left],i=left+1,j=right;

なぜここに int のポインターか!
よく参考書、サイト見てみろよ!
しかも初期化してない!

Re: クイックソートについて

Posted: 2019年7月11日(木) 11:14
by Math
クイック・ソート プログラム ってググったら一杯あんど!
for example
https://qiita.com/omu58n/items/7794f097b2c569a469bc

Re: クイックソートについて

Posted: 2019年7月13日(土) 21:49
by かずま
kazukazukazu さんが書きました:
4年前
sort_main関数でどうしてもエラーが起きてしまうのですが
エラーメッセージを書いてください。
何が足りないと思いますか?
kazukazukazu さんが書きました:
4年前
どう直せばいいでしょか。
void sort_main(int *array) { int *left; int *right; を
void quick_sort(int *array, int left, int right) { に変える。

void swap(int *a, int i, int j) { int t = a; a = a[j]; a[j] = t; }
を用意し、swap(array, i, j); 及び swap(array, left, j); で呼び出す。

main は、
int n = getFile(data); // getFile は、読み込んだデータ数を返す。
quick_sort(data, 0, n - 1);
outFile(data, n); // outFile はデータの個数を指定する。

以上のように修正してみてください。
分からないところがあれば質問していただくと詳しく説明します。