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