快速排序及文件報告

2021-08-25 12:10:31 字數 4672 閱讀 4239

#include

#include

#include

#include

#define n 1000000

void swap(long a,long x,long y)

long partition(long a,long p,long r)

}swap(a,i+1,r);

return i+1;

}void quicksort(long a,long p,long r)

{if(p

void main()

{ long *a,i;

clock_t x,y;

double t;

a=new long[n];

srand((unsigned int)time(0));//隨機取種 以當前時間取種

for(i=0;i另附報告:

quicksort演算法實驗效能分析

u 需求分析

利用隨機數生成函式生成大量資料,按不同規模呼叫快速排速演算法,記錄所花費的時間,作出執行時間(time)—輸入規模(size)圖,以反映及分析快速排序的時間複雜度隨輸入規模不斷變化的變化情況,並觀察是否符合o(nlgn)的時間複雜度。

u 演算法設計

² 設計思想

演算法所用的資料結構:

陣列long型a[n],呼叫快排序演算法時對陣列中元素進行就地重排並輸出排序規模及排序時間。

演算法基本思想:

用隨機函式生成的大量隨機數初始化陣列,演算法執行時呼叫快速排序演算法,並對所產生的隨機數進行排序並輸出隨機數的規模及每次排序花費的時間

² 概要設計

對每個函式的說明:

(1) void swap(long a,long x,long y)

該函式用來交換陣列a中兩個元素x和y的位置;

(2) long partition(long a,long p,long r)

對子陣列a[p……r]進行就地重排;

(3) void quicksort(long a,long p,long r)

遞迴呼叫進行快速排序;

² 詳細設計

主要演算法思想及描述:

#include

#include

#include

#include

#define n 1000000

void quicksort(long a,long p,long r) //分治法實現快速排序

long partition(long a,long p,long r) //對子陣列a[p……r]進行就地重排

(1) 主函式main()先產生n個隨機數放進陣列a,然後呼叫快排序演算法quicksort實現對陣列元素的就地排序,並輸出排序所花費的時間;設計如下:

void main()

long *a,i;

clock_t x,y;

double t;

a=new long[n];//隨機動態分配空間

srand((unsigned int)time(0));//隨機取種(以當前時間取種)

for(i=0;ia[i]=rand();//隨機生成a陣列

x=clock();//開始計時

quicksort(a,0,n-1); //進行快速排序

y=clock();//計時結束

t=double(y-x)/clocks_per_sec;//排序時間

printf("the number is %d\n",n);//輸出陣列規模

printf("the time is %f seconds\n",t);//輸出排序時間

(2) 函式partition(long a,long p,long r)採用分治演算法對子陣列a[p .. r ]就地重排;有三個步驟:

ø 分解:陣列a[ p .. r ]被劃分成兩個(可能空)子陣列a[p .. q-1]和a[q+1 .. r],使得a[p .. q-1]中的每個元素都小於等於a[q],而且,小於等於a[q+1 .. r]中的元素。下標q也在這個劃分過程中進行計算。

ø 解決:通過遞迴呼叫快速排序,對子陣列a[p .. q-1]和a[q+1 .. r]排序。

ø 合併:因為兩個子陣列是就地排序的,將它們的合併不需要操作:整個陣列a[ p .. r ]已排序。

設計如下:

void quicksort(long a,long p,long r)

if(pint q=partition(a,p,r);

quicksort(a,p,q-1);

quicksort(a,q+1,r);

(3) 快速排序演算法的關鍵是partition過程,它對子陣列就地重排,並返回劃分元位置。

設計如下:

long partition(long a,long p,long r)

long x=a[r]; //主元值

long i=p-1; //i為陣列a[p……q-1]中最大元素下標

long j;

for(j=p;j<=r-1;j++) //j代表當前未劃分元素下標

if (a[j]<=x)

i=i+1;

swap(a,i,j);

swap(a,i+1,r);

return i+1;

其中:void swap(long a,long x,long y) //交換陣列a中兩個元素x和y的位置

long t;

t=a[x];

a[x]=a[y];

a[y]=t;

v 注:快速排序也可採用隨機化版本,在一定意義上更符合其時間複雜度為o(nlgn)的理論值;但對於本次實驗,陣列有很強的隨機性,所以即使固定了主元值,該主元值的隨機性也很強,即不需要採用隨機化版本,從實驗結果看來,很好的符合其時間複雜度為o(nlgn)的理論值。

u 三.測試資料及結果分析

測試環境: 記憶體:1g windows vista作業系統

執行結果( 單位:s )--資料及曲線圖如下:

t/1234

5678

910平均x/1

1.11.097

1.085

1.109

1.265

1.078

1.069

1.521

1.263

1.168

1.1755

23.447

3.837

3.853

3.609

3.19

3.265

3.804

3.32

3.267

3.445

3.5037

36.956

6.758

6.515

7.06

6.624

7.06

7.032

6.562

7.268

7.245

6.908

411.441

10.731

11.771

11.461

11.439

11.652

10.308

11.76

10.741

10.834

11.2138

515.859

15.636

16.597

15.644

16.54

15.656

17.57

15.659

15.807

16.941

16.1909

621.716

22.375

21.931

21.223

23.488

21.595

23.791

21.836

22.269

21.61

22.1834

728.822

29.827

30.219

29.545

29.894

29.545

29.782

29.7

30.264

29.712

29.731

837.454

37.47

36.906

37.802

37.445

38.151

38.832

38.089

37.476

38.08

37.7705

946.695

46.091

48.396

45.843

47.089

47.67

46.462

46.398

48.248

46.257

46.9149

1058.938

57.856

57.294

57.546

56.453

59.284

57.646

56.77

56.727

57.421

57.5935

x單位:百萬

由上圖易知,實驗結果很好的符合了快速排序時間複雜度為o(nlgn)。符合理論。

u 時間及空間效能分析:

該程式執行時需要動態隨機呼叫空間(用new函式),否則計算機的硬體無法滿足一次幾百萬隨機數的空間。採用動態隨機分配空間,空間複雜度不高。

另一方面,採用分治思想的快速排序,時間複雜度為o(nlgn)。

氣泡排序及快速排序

快速排序以乙個基準值,將無序列分成兩部分 左邊小於基準值,右邊大於基準值 然後遞迴。1.氣泡排序 2.快速排序 1.氣泡排序 氣泡排序 o n2 function bubblesort arr for i 0 i return arr 2.快速排序 快速排序 function quicksort a...

快速排序及分析

歸併排序將陣列分為兩個子陣列分別排序,並將有序的子陣列歸併使得整個陣列排序 快速排序通過乙個切分元素將陣列分為兩個子陣列,左子陣列小於等於切分元素,右子陣列大於等於切分元素,將這兩個子陣列排序也就將整個陣列排序了。public static void quicksort int list publi...

快速排序及氣泡排序詳解

一 快速排序 快速排序和其他排序方法一樣,都是為了將資料進行簡潔又快速的排序。其基本的實現方法其實就是經過一次排序演算法之後,先簡單地將資料分成兩部分 取乙個中間數 一般為第乙個元素 以這個中間數為中心,左邊的數為比這個中間數小的數,右邊的數為比這個中間數大的數。之後再進行遞迴演算法,分別處理已經分...