問題:
對於給定的含有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個數中第乙個數與剩下所有數比...