快速排序算法(c语言读取文件数据)

        本节介绍一种排序算法——快速排序算法(Quick Sort)。

C语言中自带函数库中就有快速排序——qsort函数 ,包含在 <stdlib.h> 头文件中。

快速排序算法是在起泡排序的基础上进行改进的一种算法,其实现的基本思想是:通过一次排序将整个无序表分成相互独立的两部分,其中一部分中的数据都比另一部分中包含的数据的值小,然后继续沿用此方法分别对两部分进行同样的操作,直到每一个小部分不可再分,所得到的整个序列就成为了有序序列。

例如,对无序表 {49,38,65,97,76,13,27,49} 进行快速排序,大致过程为:

  1. 首先从表中选取一个记录的关键字作为分割点(称为“枢轴”或者支点,一般选择第一个关键字),例如选取 49;
  2. 将表格中大于 49 个放置于 49 的右侧,小于 49 的放置于 49 的左侧,假设完成后的无序表为:{27,38,13,49,65,97,76,49} 
  3. 以 49 为支点,将整个无序表分割成了两个部分,分别为 {27,38,13} 和 {65,97,76,49} ,继续采用此种方法分别对两个子表进行排序;
  4. 前部分子表以 27 为支点,排序后的子表为 {13,27,38} ,此部分已经有序;后部分子表以 65 为支点,排序后的子表为 {49,65,97,76} 
  5. 此时前半部分子表中的数据已完成排序;后部分子表继续以 65为支点,将其分割为{49}和 {97,76} ,前者不需排序,后者排序后的结果为 {76,97} 
  6. 通过以上几步的排序,最后由子表{13,27,38}{49}{49}{65}{76,97}构成有序表:{13,27,38,49,49,65,76,97};                                                                           整个过程中最重要的是实现第 2 步的分割操作,具体实现过程为:
  • 设置两个指针 low 和 high,分别指向无序表的表头和表尾,如下所示:

  • 先由 high 指针从右往左依次遍历,直到找到一个比 49 小的关键字,所以 high 指针走到 27 的地方停止。找到之后将该关键字同 low 指向的关键字进行互换:

  • 然后指针 low 从左往右依次遍历,直到找到一个比 49 大的关键字为止,所以 low 指针走到 65 的地方停止。同样找到后同 high 指向的关键字进行互换:

  • 指针 high 继续左移,到 13 所在的位置停止(13<49),然后同 low 指向的关键字进行互换:

  • 指针 low 继续右移,到 97 所在的位置停止(97>49),然后同 high 指向的关键字互换位置:

  • 指针 high 继续左移,此时两指针相遇,整个过程结束;

以上是基本的快排操作原理,接下来给出源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define ll long long int
void quickSort(int arry[], int low, int high)
{
        if (low > high) return;
        int i = low, j = high, temp = arry[i];
        while (i < j)
        {
            while (temp < arry[j] && i < j) 
				j--;
            if (i < j) 
				arry[i++] = arry[j];
			while (temp>arry[i] && i < j) 
				i++;
            if (i < j)
                arry[j--] = arry[i];
        }
        arry[i] = temp;
        quickSort(arry, low, i - 1);//左边
        quickSort(arry, i + 1, high);//右边
}
//输出
void print(int arry[], int len)
{
    for (int i = 0; i < len; i++)
        printf("%d ", arry[i]); 
}
//快排算法 
int OutputData(int arry[],int N)
{
	 FILE * pFile;
	pFile = fopen("输出值.txt", "w");
	if (NULL == pFile)
	{//文件打开错误
		printf("error");
		return 0;
	}
	for (int i = 0; i < N; i++)
	{//循环输出数据并写入
	
		fprintf(pFile,"%d ", arry[i]);//这里循环写入文件 3个  3.14
	}
	fclose(pFile);//最后一定记得关闭文件
 } 
const ll N=1000;
int main()
{
		int* arry = (int*)malloc(sizeof(int) * N);
        int i=0;
        clock_t start,stop;
		double duration;
        FILE *file;
        file=fopen("C:\\Users\\pfy13\\Desktop\\1000.txt","r");
		if(!file)
		puts("打开文件失败!");
		while(!feof(file))
		{fscanf(file,"%d",&arry[i]);
		i++;
		 } 
		 fclose(file);
        quickSort(arry,0,N-1);
        OutputData(arry,N);
        print(arry,N); 
        free(arry);
        return 0;
}

其中

 这里的测试集根据读者自己的测试集文件地址改变。

总结:

快速排序算法的时间复杂度O(nlogn),是所有时间复杂度相同的排序方法中性能最好的排序算法。

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用C语言中的文件操作函数和排序算法来实现文件内数据排序。下面是一个示例程序,可以将文件中的整数按照从小到大的顺序排序,并将结果输出到另一个文件中。 ```c #include <stdio.h> #include <stdlib.h> #define MAX_LEN 1000 int main() { FILE *in_file, *out_file; int data[MAX_LEN], n = 0, i, j, temp; // 打开输入文件 in_file = fopen("input.txt", "r"); if (in_file == NULL) { printf("Error opening file!\n"); exit(1); } // 读取文件中的数据 while (fscanf(in_file, "%d", &data[n]) == 1) { n++; } // 关闭输入文件 fclose(in_file); // 使用冒泡排序算法排序 for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (data[j] > data[j + 1]) { temp = data[j]; data[j] = data[j + 1]; data[j + 1] = temp; } } } // 打开输出文件 out_file = fopen("output.txt", "w"); if (out_file == NULL) { printf("Error opening file!\n"); exit(1); } // 将排序后的结果输出到文件中 for (i = 0; i < n; i++) { fprintf(out_file, "%d ", data[i]); } // 关闭输出文件 fclose(out_file); return 0; } ``` 在这个示例程序中,我们首先使用 `fopen` 函数打开输入文件,然后使用 `fscanf` 函数读取文件中的数据,并将其存储在数组 `data` 中。接着,我们使用冒泡排序算法对数组 `data` 进行排序。最后,我们使用 `fopen` 函数打开输出文件,然后使用 `fprintf` 函数将排序后的结果输出到文件中。注意,这里使用的是 `fprintf` 函数而不是 `fscanf` 函数,因为我们要输出到文件中而不是从文件中读取数据。 当然,还有其他的排序算法可以用来进行文件内数据排序,比如选择排序、插入排序、快速排序等,具体使用哪种算法取决于数据量的大小和排序的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小彭同学△

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值