交換排序 氣泡排序與快速排序

2022-03-11 03:17:11 字數 2846 閱讀 2843

氣泡排序:廢話不多說,直接上**,注意2中冒泡方法的不同。

* user: sqtds

* date: 13-1-15

* time: 下午3:03

*/public

class bubble }}

}public

static

void swap(int array , int left , int right)

public

static

void bubblesort(int array)

if(!exchange) //本趟排序未發生交換,提前終止演算法

return;

} //endfor(外迴圈)

} //bubblesort

public

static

void main(string args);

//sort(array);

bubblesort(array);

for(int i: array)}}

(1)初始

r[1..n]為無序區。

(2)第一趟掃瞄

從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(r[n],r[n-1]),(r[n-1],r[n-2]),…,(r[2],r[1]);對於每對氣泡(r[j+1],r[j]),若r[j+1].key快速排序:

(1) 分治法的基本思想

分治法的基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

(2)快速排序的基本思想

設當前待排序的無序區為r[low..high],利用分治法可將快速排序的基本思想描述為:

①分解:

在r[low..high]中任選乙個記錄作為基準(pivot),以此基準將當前無序區劃分為左、右兩個較小的子區間r[low..pivotpos-1)和r[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄(不妨記為pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。

注意:劃分的關鍵是要求出基準記錄所在的位置pivotpos。劃分的結果可以簡單地表示為(注意pivot=r[pivotpos]):

r[low..pivotpos-1].keys≤r[pivotpos].key≤r[pivotpos+1..high].keys

其中low≤pivotpos≤high。

②求解:

通過遞迴呼叫快速排序對左、右子區間r[low..pivotpos-1]和r[pivotpos+1..high]快速排序。

③組合:

因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。

* user: sqtds

* date: 13-1-14

* time: 上午10:38

*/public

class quicksort

i++;}}

for(int a:array)

system.out.println("");

quciksort(array, point+1 ,right);

quciksort(array, left ,point-1);}}

public

static

void swap(int array,int x, int y)

public

static

int partition(int array,int left, int right)

public

static

void quicksort(int array, int left, int right)

}public

static

void main(string args);

/*** 4,6,2,5,1,7,5,4,3,2 ,i=1,j=1,p=0

* 4,6,2,5,1,7,5,4,3,2,i=1,j=2,p=0

* 2,6,4,5,1,7,5,4,3,2,i=2,j=3,p=0

* 2,6,4,5,1,7,5,4,3,2,i=2,j=4,p=0

* ...

*交換i和p

*/quciksort(array,0,array.length-1);

//quicksort(array,0,array.length-1);

for(int a:array)}}

//並返回基準記錄的位置

recetype pivot=r[i]; //用區間的第1個記錄作為基準 '

while(i//從區間兩端交替向中間掃瞄,直至i=j為止

while(i=pivot.key) //pivot相當於在位置i上

j--; //從右向左掃瞄,查詢第1個關鍵字小於pivot.key的記錄r[j]

if(i//表示找到的r[j]的關鍵字

r[i++]=r[j]; //相當於交換r[i]和r[j],交換後i指標加1

while(i//pivot相當於在位置j上

i++; //從左向右掃瞄,查詢第1個關鍵字大於pivot.key的記錄r[i]

if(i//表示找到了r[i],使r[i].key>pivot.key

r[j--]=r[i]; //相當於交換r[i]和r[j],交換後j指標減1

} //endwhile

r[i]=pivot; //基準記錄已被最後定位

return i;

} //partition

交換排序 氣泡排序與快速排序

氣泡排序 基本思想 每次比較兩個相鄰的元素,如果它們的順序錯誤就把它們交換過來。核心 for i 1 i n 1 i 快速排序 交換 快速排序 include int a 101 n void quicksort int left,int right 將基準數歸位 a left a i a i te...

交換排序(氣泡排序與快速排序)

1 氣泡排序 2void bubblesort int array,int n 316 17 18 快速排序動態圖 1 快速排序01 2void insertsort int array,int left,int right 315 swap array i array j 將比樞軸移小的資料移至低...

交換排序 氣泡排序,快速排序

交換排序 氣泡排序,快速排序 執行環境 vs2010 include include include include define ok 1 define true 1 define false 0 define maxsize 50 typedef struct redtype typedef s...