分治法解决快速排序问题

 用分治法实现快速排序问题

1.实验目的

(1) 掌握分治策略的基本思想及求解问题的主要步骤;

(2) 应用分治策略的基本思想设计快速排序算法。

2.实验环境

  Windows操作系统,VC++ 6.0。

3.实验内容

有n个无序的数值数据,现要求将其排列成一个有序的序列。

4.实验步骤

(1) 介绍算法的主要设计思想;

(2) 自定义input函数,从文件中读入必要的数据;

(3) 自定义algorithm函数,得到问题的解(重点步骤);

(4) 自定义output函数,输出问题的解到外部文件;

(5) 自定义main函数,初始化相关信息并调用上述三个函数完成实验任务;

(6) 设计测试用例进行测试,验证程序是否正确。

#include<stdio.h>
#include<stdlib.h>
int Partition(int number[], int left, int right);
int input(int number[]) {
	FILE *fp;
	int i = -1;
	if ((fp = fopen("c:\\number.txt","r")) == NULL)
	{
		printf("file open error!\n");
		exit(0);
	}
	while (!feof(fp)) {
		fscanf(fp,"%d ", &number[++i]);
	}
	fclose(fp);
	return i;
}
void QuickSort(int number[],int left,int right) {
	if (right <= left)
	{
		return;
	}
	int pivot = (left + right) / 2; //选择轴值
	//不借助 第三个变量实现两个变量之间的值交换  
	//将轴值放入到数组末端 
	number[pivot] = number[pivot] + number[right];
	number[right] = number[pivot] - number[right];
	number[pivot] = number[pivot] - number[right];
	pivot = Partition(number,left, right);              //分割后轴值到达正确位置  
	QuickSort(number,left, pivot - 1);                  //对轴值左边的子序列进行递归快速排序  
	QuickSort(number,pivot + 1, right);                 //对轴值右边的子序列进行递归快速排序 
}
int Partition(int number[],int left,int right) {
	int l = left;
	int r = right;
	int temp = number[r];//将轴值放入到临时变量中
	while (l!=r) {
		//l指针向右移动,越过那些小于轴值得记录,直到找到一个大于轴值得记录
		while (number[l]<=temp&&l<r)
		{
			l++;
		}
		if (l < r) {
			number[r] = number[l];
			r--;  //r向左移动一步
		}
		while (number[r] >= temp && r>l)
		{ 
			r--;
		}
		if (r>l)
		{
			number[l] = number[r];
			l++;  //l指针向右移动一步  
		}
	}
	number[l] = temp;  //把轴值回填到分界位置l上  
	
	return l;

}
void output(int number[],int right) {
	FILE *fp;
	int i = 0;
	if ((fp = fopen("c://num.txt", "w")) == NULL) {
		printf("file open error!");
		exit(0);
	}
	while (i<=right)
	{
		fprintf(fp, "%d ", number[i]);
		i++;
	}
	fclose(fp);
}
int main()
{
	int number[100];
	int left = 0,right=input(number),i;
	QuickSort(number, left, right);
	output(number, right);
	
	return 0;
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
快速排序是一种基于分治思想的排序算法。其核心思想是通过一次排序将待排序序列分成两个子序列,其中一个子序列的所有元素都小于另一个子序列的所有元素,然后对这两个子序列分别进行递归排序,直到整个序列有序。 以下是快速排序的C语言代码实现: ```c #include<stdio.h> void quick_sort(int arr[], int left, int right){ int i = left, j = right, temp; int pivot = arr[(left + right) / 2]; while(i <= j){ while(arr[i] < pivot) i++; while(arr[j] > pivot) j--; if(i <= j){ temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } } if(left < j){ quick_sort(arr, left, j); } if(i < right){ quick_sort(arr, i, right); } } int main(){ int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); quick_sort(arr, 0, n - 1); for(int i = 0; i < n; i++){ printf("%d ", arr[i]); } return 0; } ``` 在实现中,我们以数组中间的元素为基准点,将数组分为左右两个子序列,并对这两个子序列进行递归排序,直到整个序列有序。在排序过程中,我们维护两个指针i和j,分别从序列的左右两边逼近,当i所指向的元素大于等于基准点时,停止移动;当j所指向的元素小于等于基准点时,停止移动。如果i和j都停止移动,且i <= j,则交换i和j所指向的元素,并将i和j分别向右和向左移动一位。重复上述过程,直到i > j为止。最后,我们将数组分为的左右两个子序列分别进行递归排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

酱江奖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值