• 分治法解决高速排序问题


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

    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!
    ");
    		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;
    }
    

  • 相关阅读:
    Insertion Sort List
    Max Points on a Line
    Evaluate Reverse Polish Notation
    vue路由传参的三种基本方式
    如何搭建一个vue项目
    vue路由跳转时更改页面title
    CSS清除浮动大全共8种方法
    border:none 与border:0的区别
    for..in和for..of的功能
    IE浏览器兼容问题-----html和css的兼容写法
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7297392.html
Copyright © 2020-2023  润新知