演算法五之快速排序

2022-07-20 15:21:14 字數 1646 閱讀 7635

一、快速排序(quicksort)思想

設要排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用陣列的第乙個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。

一趟快速排序的演算法是:

1)設定兩個變數i、j,排序開始的時候:i=0,j=n-1;

2)以第乙個陣列元素作為關鍵資料,賦值給key,即key=a[0];

3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第乙個小於key的值a[j],將a[j]和a[i]互換;

4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第乙個大於key的a[i],將a[i]和a[j]互換;

5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中a[j]不小於key,4中a[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。

二、演算法實現

(1)遞迴演算法

public

static

void quicksort(int data, int low, int

high)

int mid = sortunit(data, low, high);//

一趟排序

quicksort(data, low, mid - 1);//

左邊排序

quicksort(data, mid + 1, high);//

右邊排序

}

public

static

int sortunit(int data, int low, int

high)

data[low] = data[high];//

交換儲存小的資料

//從首部尋找比key大的資料

while (key >= data[low]&&lowdata[high] = data[low];//

交換儲存大的資料

} data[low] = key;//

回填比較資料

return

high;

}

(2)非遞迴演算法

public

static

void quicksort(int

data)

//右邊排序佇列儲存

if (mid + 1}

}public

static

int sortunit(int data, int low, int

high)

data[low] = data[high];//

交換儲存小的資料

//從首部尋找比key大的資料

while (key >= data[low]&&lowdata[high] = data[low];//

交換儲存大的資料

} data[low] = key;//

回填比較資料

return

high;

}

排序演算法之 快速排序(五)

include include include define len 10 void show int str,int length void quick sort int str,int length void quick sort int str,int left,int right using...

演算法五之快速排序

一 快速排序 quicksort 思想 設要排序的陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對...

排序演算法(五) 快速排序

在陣列中選取乙個數作為基準值,進行乙個partition過程,將小於該數的放在左邊,大於的放在右邊,等於的放在中間,再對左右分別進行該操作。時間複雜度 每次partition可以將乙個數字位置確定,將陣列劃分為兩部分,因此想要有序,理想情況每次剛好兩邊大小一樣,則一共需要logn次partition...