?? 快速排序.cpp
字號:
/*快速排序采用分治算法,將所需要排序的內容從文件讀入放入數組a[p:r],按以下三個步驟進行排序
以a[p]為基準元素將數組分為三段,將大于基準元素的放到后面的單元,小的放到前面的單元,
再用遞歸對a[p:q-1],a[q+1:r]進行排序,最后合并
時間復雜度:最壞時間復雜度:O(n2)
平均時間復雜度:O(nlogn)
*/
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include<stdio.h>
#define N 10
int QKPass(int r[], int low, int high)
{
int Pkey=r[low];
r[0]=r[low];
while(low<high)
{
//從前往后從后往前搜索比基準元素大或者小的元素,并進行交換
while(low<high && r[high]>=Pkey)--high;
if(low==high)
{
r[low]=r[0];
return high;
}
else
r[low]=r[high];
while(low<high && r[low]<=Pkey) ++low;
if(low==high)
{
r[low]=r[0];
return low;
}
else
r[high]=r[low];
} //while
r[low]=r[0];
return low; //返回樞軸所在位置
} //QKPass
void QKSort(int r[], int s, int t)
{
//對記錄序列L.r[s..t]進行快速排序
if (s<t)
{
//長度大于1
int pos=QKPass(r, s, t);
//對 L.r[s..t] 進行一次劃分
QKSort(r, s, pos-1);
//對低子序列遞歸排序, pos是樞軸位置
QKSort(r, pos+1, t); //對高子序列遞歸排序
} //if
} //QKSort
void main()
{
srand(time(0));
int i,r[N+1];
int n;
//從文件讀入
FILE *fp;
fp=fopen("input.txt","r");
fscanf(fp,"%d",&n);
for(i=1; i<=n; i++) fscanf(fp,"%d",&r[i]);
QKSort(r, 1, n);
fclose(fp);
//從文件寫入
fp=fopen("output.txt","w");
for(i=1; i<=n; i++)
fprintf(fp,"%d\n",r[i]);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -