遞迴演算法設計 選擇排序和氣泡排序

2021-10-23 17:57:04 字數 1864 閱讀 1789

問題:

對於給定的含有n個元素的陣列a,分別採用選擇排序和氣泡排序

方法:

將a[0…n-1]分為有序區a[0…n-1]和無序區兩個部分,有序區中的所有元素都不大於無序區中的元素,初始時有序區為空,即i=0,經過n-1趟排序(i=1~n-2),每趟排序採取不同方式將無序區中的最小元素移動到無序區的開頭,即a[i]處。

採用比較方式在無序區中選擇最小元素並放到開頭

設f(a,n,i)用於在無序區a[i…n-1] (共n-i個元素)中選擇最小元素並放在a[i]處,是「大問題「

則f(a,n,i+1)用於在無序區a[i+1…n-1]中選擇最小元素並放在a[i+1]處,是「小問題」

當i=n-1時所有元素有序(此時無序區為a[n-1…n-1]),即無序區只有乙個元素,這個元素可以看做是有序的

1.分析思路 —— 遞迴演算法:

當i=n-1時,

f(a,n,i)—— 不做任何事情,演算法結束

否則f(a,n,i)——通過簡單比較挑選a[i…n-1]中的最小元素,a[k]放到a[i-1]處;f(a,n,i+1)

2.**:

#include

void swap(int &x,int &y)

void disp(int a[

],int n)

void selectsort(int a[

],int n,int i)

}int main();

printf(

"排序前:");

disp(a,n)

;selectsort(a,n,0)

;printf(

"排序後:");

disp(a,n)

;//return 0;

}

採用交換方式將無序區中的最小元素放到開頭處

設f(a,n,i)用於將無序區a[i…n-1] (共n-i個元素)中的最小元素交換到a[i]處,是「大問題「

則f(a,n,i+1)用於在無序區a[i+1…n-1]中的最小元素交換到a[i+1]處,是「小問題」

當i=n-1時所有元素有序(此時無序區為a[n-1…n-1]),即無序區只有乙個元素,這個元素可以看做是有序的

1.分析思路 —— 遞迴演算法:

當i=n-1時,

f(a,n,i)—— 不做任何事情,演算法結束

否則f(a,n,i)——對a[i…n-1]中的元素序列從a[n-1]開始進行相鄰比較,若相鄰元素反序則交換,若沒有交換則返回,否則執行f(a,n,i+1)

2.**

#include

void swap(int &x,int &y)

void disp(int a[

],int n)

void bubblesort(int a[

],int n,int i)

if(exchange==false)

return

;else //發生交換繼續遞迴呼叫

bubblesort(a,n,i+1);}

}int main();

printf(

"排序前:");

disp(a,n)

;bubblesort(a,n,0)

;printf(

"排序後:");

disp(a,n)

;//return 0;

}

排序演算法 冒泡和選擇排序

氣泡排序的基本思想是 通過對待排序序列從前向後 從下標較小的元素開始 依次比較 相鄰元素的值,若發現逆序則交換,使值較大的元素逐漸從前移向後部,就象水底下的氣泡一樣逐漸向上冒。氣泡排序演算法 public static int maopaosort int initial return initia...

排序演算法 冒泡和選擇

最近複習一下排序演算法,從簡單的開始,陸續寫上來 一 氣泡排序 氣泡排序總的平均時間複雜度為 import random def bubblesort arr for i in range 0,len arr for j in range i 1,len arr if arr i arr j tem...

排序演算法之氣泡排序和選擇排序

個人感覺氣泡排序和選擇排序相似,都是通過兩個for迴圈,兩兩比較實現排序過程。但比較的不同之處在於,若有n個數,氣泡排序進行n 1趟比較,第一趟進行n 1次比較,第i趟進行n i次比較,並且是連續相鄰的兩個數比較,第乙個和第二個數比,再第二個和第三個數比 而選擇排序是將n個數中第乙個數與剩下所有數比...