数据结构快速排序与堆排序的实现

堆排序:

1)问题描述

     对于无序正整数序列,写程序用堆排序算法将其排序成按值非递减有序序列。

2)输入描述

   文本文件“input.txt”中保存了n个测试用例,文件以-1结束。每个用例的第一行m表示待排序正整数序列的元素个数,第二行为该序列的m个正整数。

3)输出描述

    输出结果保存在文本文件“output.txt”中。对于每个测试用例均有二行输出,第一行输出“Case #:##”,#表示用例的编号(1…n),##表示排序后有序序列的元素个数,第二输出##个按值非递减有序元素。

快速排序

1)问题描述

    对于任意的无序正整数序列,写程序用快速排序算法将其排序成按值非递减有序序列。

2)输入描述

   文本文件“input.txt”中保存了n个测试用例,文件以-1结束。每个用例的第一行m表示第一个待排序整数序列的元素个数,第二行为该序列的m个元素。

3)输出描述

    输出结果保存在文本文件“output.txt”中。对于每个测试用例均有二行输出,第一行输出“Case #:##”,#表示用例的编号(1…n),##表示排序后有序序列的元素个数,第二输出##个按值非递减有序元素。

4)输入示例

   5

   10  1  8  4   30

   7

   35  60  50  2   20   4   86

   3

   38  100  45

   -1

5)输出示例   

   Case 1:5

  1.  4  8  10  30

Case 2:7

2   4  20  35  50  60  86

Case 3:3

38  45  100


#include<stdio.h>
#include<stdlib.h>

typedef int ElementType;
#define MAX_SIZE 5000
#define SWAP(x,y,t)((t) = (x) , (x) = (y), (y) = (t))
#define LeftChild(i) (2*(i)+1) 
int ReadDataFile(FILE* fin, ElementType A[], int& n);
void WriteDataFile(ElementType A[], FILE* fout, int CaseID, int N);
void heapSort(ElementType A[], int N);
void PercDown(ElementType A[], int i, int N);
void Quicksort(ElementType A[], int left, int right);
int Partition(ElementType A[], int left, int right);

void  main() {
    ElementType A[MAX_SIZE];
    FILE* fin, * fout;
    int n;
    int CaseID = 0;
    fin = fopen("input.txt", "r");
    fout = fopen("output.txt", "w");
    while (1) {
        if (ReadDataFile(fin, A, n) == -1)break;
        heapSort(A, n);
        /*Quicksort(A, 0, n-1);*/
        WriteDataFile(A, fout, ++CaseID, n);
    }
    fclose(fout);
    fclose(fin);
    system("pause");
}
int ReadDataFile(FILE* fin, ElementType A[], int& N) {
    fscanf(fin, "%d", &N);
    if (N == -1) return N;
    for (int i = 0; i < N; i++) {
        fscanf(fin, "%d", &A[i]);
    }
    return 0;

}
void WriteDataFile(ElementType A[], FILE* fout, int CaseID, int N) {
    fprintf(fout, "CaseID: %d\n", N);
    for (int i = 0; i < N; i++) {
        fprintf(fout, "%10d", A[i]);
    }
    fprintf(fout, "\n");
}
void heapSort(ElementType A[], int N) {
    int i;
    ElementType temp;
    for (i = N / 2; i >= 0; i--) /* BuildHeap */
        PercDown(A, i, N);
    for (i = N - 1; i > 0; i--) {
        SWAP(A[0], A[i], temp); /* DeleteMax */
        PercDown(A, 0, i);

    }
}
void PercDown(ElementType A[], int i, int N) {
    int Child;
    ElementType Tmp;
    for (Tmp = A[i]; LeftChild(i) < N; i = Child)
    {
        Child = LeftChild(i);
        if (Child != N - 1 && A[Child + 1] > A[Child])
            Child++;
        if (Tmp < A[Child])
            A[i] = A[Child];
        else
            break;
    }
    A[i] = Tmp;

}
void Quicksort(ElementType A[], int left, int right) {
    if (left < right) {
        int nextWhere = Partition(A, left, right);
        Quicksort(A, left, nextWhere - 1);
        Quicksort(A, nextWhere + 1, right);
    }
}
int Partition(ElementType A[], int left, int right) {
    ElementType pivot = A[left];
    ElementType temp;
    while (left < right) {
        while (pivot < A[right]) --right;
        while (pivot > A[left]) ++left;
        SWAP(A[right], A[left], temp);
    }
    A[left] = pivot;
    return left;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值