分治法解決快速排序問題
阿新 • • 發佈:2019-01-08
用分治法實現快速排序問題
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; }