1. 程式人生 > >分治法解決快速排序問題

分治法解決快速排序問題

用分治法實現快速排序問題

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;
}