冒泡法排序c语言函数模板,使用模板技术的冒泡排序
#include
#include
#include
using namespace std;
template
bool compare(Elem lhs, Elem rhs){
if (lhs<=rhs)? return false;
else return true;
}
//template
//typedef bool(*comparefunc)(Elem lhs, Elem rhs);?? 不能利用模板來重定義類型。
template
void bubblesort(Elem* arr, int n, bool(*func)(Elem lhs, Elem rhs) = compare)
//下面這個語句中相當(dāng)于對函數(shù)指針起了兩個名字,應(yīng)該是上面這樣。
//實際上函數(shù)指針的類型表示是bool (*)(Elem ,Elem),func已經(jīng)是函數(shù)指針名了。
//void bubblesort(Elem* arr, int n, bool(*func)(Elem lhs, Elem rhs)
comparefunc= compare)
{
Elem temp;
for (int i = 0; i < n-1; i++){? //一要保證數(shù)組不越界,二要保證保證對所有數(shù)據(jù)進(jìn)行排序。
for (int j = i + 1; j < n ; j++){
if (arr[j] < arr[i]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
class Credit{
public:
Credit():value(0){? //利用初始化參數(shù)列表來初始化字段。
}
Credit(int value){
this->value = value;
}
int getValue(){
return this->value;
}
void setValue(int value){?? //setValue表示的是一個賦值過程,并不要求將結(jié)果返回。所以返回值類型為void類型。
this->value = value;
}
bool operator
return (this->value < other.getValue()) ? true : false;
}
bool operator==(Credit& other){
return (this->value == other.getValue()) ? true : false;
}
bool operator<=(Credit& other){
//在進(jìn)行運算符重載時,定義的重載函數(shù)的返回值等信息要與原運算符的本質(zhì)保持一致,這里應(yīng)該返回的是布爾類型。
//下面的語句提示Credit沒有value成員。是因為在類中只能訪問當(dāng)前對象(用this指針引用的對象的private數(shù)據(jù)成員,對于與當(dāng)前類同類型的其他實例在本類的成員函數(shù)中無法直接訪問其private數(shù)據(jù)成員。所以說在當(dāng)前類本身中可以訪問類的private數(shù)據(jù)成員,只是針對類的當(dāng)前實例,而不是該類型的所有實例。??????? //return (this->value <=other.value) ? true : false;
return (this->value <= other.getValue()) ? true : false;??????? //也可以寫成? return (this
//當(dāng)類本身的比較復(fù)雜時,這樣寫可充分利用已有代碼,并且當(dāng)其他運算符要進(jìn)行變動時,這里一般不需要改動。
}
private:
int value;
};
int main(){
int arr[10] = { 3, 5, 7, 11, 78, 34, 67, 45, 23, 4 };
bubblesort(arr, 10);
for (int num : arr){
cout << num << " ";
}
Credit creditSet[23];
srand(time(NULL));? //time是個內(nèi)聯(lián)函數(shù),用static修飾,參數(shù)和返回值都是一個64位的整數(shù),但是srand的參數(shù)是unsigned int。
for (int i = 0; i < 23; i++){? //注意這里的23可不能用sizeof(creditSet/sizeof(Credit))來表示,因為有內(nèi)存對齊的影響。
creditSet[i].setValue(rand() % 100);
}
cout << endl;
bubblesort(creditSet, 23);
for (int i = 0; i < 23; i++){? //注意這里的23可不能用sizeof(creditSet/sizeof(Credit))來表示,因為有內(nèi)存對齊的影響。
cout<
}
return 0;
}
一些參考資料
C/C++怎樣產(chǎn)生隨機(jī)數(shù):這里要用到的是rand()函數(shù), srand()函數(shù),C語言/C++里沒有自帶的random(int number)函數(shù)。
(1)? 如果你只要產(chǎn)生隨機(jī)數(shù)而不需要設(shè)定范圍的話,你只要用rand()就可以了:rand()會返回一隨機(jī)數(shù)值, 范圍在0至RAND_MAX 間。RAND_MAX定義在stdlib.h, 其值為2147483647。(注:是否包括區(qū)間端點????)
(2)? 如果你要隨機(jī)生成一個在一定范圍的數(shù),你可以在宏定義中定義一個random(int number)函數(shù),然后在main()里面直接調(diào)用random()函數(shù):
例如:隨機(jī)生成10個0~100的數(shù):
#include
#include
#define random(x) (rand()%x)void main()
{
for(int x=0;x<10;x++)
printf("%d/n",random(100));
}
(3)但是上面兩個例子所生成的隨機(jī)數(shù)都只能是一次性的,如果你第二次運行的時候輸出結(jié)果仍和第一次一樣。這與srand()函數(shù)有關(guān)。srand()用來設(shè)置rand()產(chǎn)生隨機(jī)數(shù)時的隨機(jī)數(shù)種子。在調(diào)用rand()函數(shù)產(chǎn)生隨機(jī)數(shù)前,必須先利用srand()設(shè)好隨機(jī)數(shù)種子(seed), 如果未設(shè)隨機(jī)數(shù)種子, rand()在調(diào)用時會自動設(shè)隨機(jī)數(shù)種子為1。上面的兩個例子就是因為沒有設(shè)置隨機(jī)數(shù)種子,每次隨機(jī)數(shù)種子都自動設(shè)成相同值1 ,進(jìn)而導(dǎo)致rand()所產(chǎn)生的隨機(jī)數(shù)值都一樣。
srand()函數(shù)定義 : void srand (unsigned int seed);
通常可以利用geypid()或time(0)的返回值來當(dāng)做seed如果你用time(0)的話,要加入頭文件#include
在stdlib.h 中這兩個函數(shù)的原型是:
int rand();
void srand (unsigned int);
擴(kuò)充:
x = rand()%11; /*產(chǎn)生1~10之間的隨機(jī)整數(shù)*/
y = rand()%51 - 25; /*產(chǎn)生-25 ~ 25之間的隨機(jī)整數(shù)*/
注:根據(jù)要求的兩個數(shù)據(jù)之間的差值確定rand函數(shù)后面取余多少。比如產(chǎn)生【a,b]的數(shù),則取余的數(shù)是b-a,若a=-7,b=-2,取余后一共有b-a+1種值,則取余的數(shù)為b-a+1,結(jié)果在(0,b-a)之間,共b-a+1種值。
取余后的值中0對應(yīng)區(qū)間中的小值,所以delta=a-0
z = ((double)rand()/RAND_MAX)*(b-a) + a;/*產(chǎn)生區(qū)間[a,b]上的隨機(jī)數(shù)*/
總結(jié)
以上是生活随笔為你收集整理的冒泡法排序c语言函数模板,使用模板技术的冒泡排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 取木棒21根c语言,关于m根火柴 ,人机
- 下一篇: c语言分配内存空间方法,C语言之动态分配