快速排序算法C语言实现

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

  4  8  10  30

 Case 2:7

 2   4  20  35  50  60  86

 Case 3:3

 38  45  100

代码实现:

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

void swap(int a[], int low, int high) //交换两个数的值
{
    int t = a[low];
    a[low] = a[high];
    a[high] = t;
}

int getpoint(int a[], int low, int high)  //计算基准点,分割为左右两个数组
{
    int point = a[low];//基准点等于第一个元素
    while (low < high)
    {
        while (low < high && a[high] >= point)//控制high指针比较并左移
        {
            high--;
        }
        swap(a, low, high);
        while (low < high && a[low] <= point)//控制low指针比较并右移
        {
            low++;
        }
        swap(a, low, high);
    }
    return low;//返回基准点位置
}
    
    

void quicksort(int a[], int low, int high)  //low:起始位置 high:末尾位置
{
    if (low < high) {
        int point = getpoint(a, low, high);//计算基准点
        quicksort(a, low, point - 1);  //对基准点的左边进行排序
        quicksort(a, point + 1, high);//对基准点的右边进行排序
    }
}

int main()
{
    FILE* fin = fopen("D:\\input.txt", "r");
    FILE* fout = fopen("D:\\output.txt", "w");
    int N; //数组中的元素个数
    int a[5000];
    int count = 0;//记录一共有多少组数
    int i, j;
    while (true)
    {
        fscanf(fin, "%d", &N);
        if (N == -1) break;//文件以-1结束
        count++; 
        fprintf(fout, "case %d:%d\n", count, N);
        for (i = 0; i < N; i++)
        {
            fscanf(fin, "%d", &a[i]);
        }
        quicksort(a, 0, N - 1);
        for (j = 0; j < N; j++)
        {
            fprintf(fout, "%d ", a[j]);
        }
        fprintf(fout, "\n");
    }
    fclose(fin);
    fclose(fout);
    system("pause");
}

运行结果:(当然,题目真正的input.txt是一个巨长无比的文件,为了方便展示我用题干的样例写数据进行测试啦)

算法时间复杂度分析:

最坏情况:每一轮都分不成两组,一共要分n轮

时间复杂度:O(n^2)

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值