函数指针的应用 把函数指针作为函数的参数 设计一个通用的排序函数,可以排序任何类型 的数据(比如struct类型) struct User { 按姓名排:Aice,Bob,Carol char *name; int dept; ; 按系号排:Carol,.Bob,Alice User heads[]= “Alice'”,10, “Bob”,5, “Carol'",1 ; LoCCS
函数指针的应用 把函数指针作为函数的参数 设计一个通用的排序函数,可以排序任何类型 的数据 (比如struct类型) struct User { char *name; int dept; }; User heads[ ]={ “Alice” , 10, “Bob” , 5, “ Carol” , 1 }; 按姓名排:Alice, Bob, Carol 按系号排:Carol, Bob, Alice
气泡排序法(回顾) 对数组元素进行扫描。第一遍扫描冒出一个最 大的气泡,放入最后一个位置。然后对剩余元 素再进行第二次冒泡,冒出最大的泡放入倒数 第二个位置,依次执行到最后一个元素。 ©伪代码表示 For (i=1;i<n;++i) 从元素0到元素n-进行冒泡,最大的泡 放入元素n-i; LoCCS
气泡排序法 (回顾) 对数组元素进行扫描。第一遍扫描冒出一个最 大的气泡,放入最后一个位置。然后对剩余元 素再进行第二次冒泡,冒出最大的泡放入倒数 第二个位置,依次执行到最后一个元素。 伪代码表示 For (i=1; i<n; ++i) 从元素0到元素n-i进行冒泡,最大的泡 放入元素n-i;
冒泡过程 ©从头到尾依次处理:比较相邻的两个元素,如 果大的在前小的在后,就交换这两个元素 这样经过从头到尾的检查,最大的一个就被交 换到最后了 © 如果在一次起泡中没有发生交换,则表示数据 都已排好序,不需要再进行起泡 LoCCS
冒泡过程 从头到尾依次处理:比较相邻的两个元素,如 果大的在前小的在后,就交换这两个元素 这样经过从头到尾的检查,最大的一个就被交 换到最后了 如果在一次起泡中没有发生交换,则表示数据 都已排好序,不需要再进行起泡
进一步细化 for (i=1;i<n;++i) 从元素0到元素n-i进行起泡,最大的泡放入元素n-i if (没有发生过数据交换)break; LoCCS
进一步细化 for (i=1; i<n; ++i) { 从元素0到元素n-i进行起泡,最大的泡放入元素n-i; if (没有发生过数据交换) break; }
罗 待冒泡的元素 5730421968 待冒泡的元素 待冒泡的元素 5 3 0 421768 9 30421567 89 待冒泡的元素 待冒泡的元素 0 3 2145678 9 0213456789 待冒泡的元素 0123456789 LoCCS
5 7 3 0 4 2 1 9 6 8 待冒泡的元素 5 3 0 4 2 1 7 6 8 9 待冒泡的元素 3 0 4 2 1 5 6 7 8 9 待冒泡的元素 0 3 2 1 4 5 6 7 8 9 待冒泡的元素 0 2 1 3 4 5 6 7 8 9 待冒泡的元素 0 1 2 3 4 5 6 7 8 9 待冒泡的元素
void sort(int a,int n) int i,j,tmp; bool flag; for (i=1;i<n;++i) {flag false; for (j=0;j<n-i;++j) if (a[j+1]<a[j]) [tmp a[];a[j]a[j+1];a[+1]=tmp;flag true;} if(flag)break;*一趟冒泡中没有发生交换,排序结束*/ cout <endl; for (i=0;i<n;++i)cout <ali]<<'' } LoCCS
void sort(int a[], int n) { int i, j, tmp; bool flag; for (i=1; i<n; ++i) {flag = false; for (j=0; j<n-i; ++j) if (a[j+1] < a[j]) {tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; flag = true;} if (!flag) break;/* 一趟冒泡中没有发生交换,排序结束*/ } cout << endl; for (i=0; i<n; ++i) cout << a[i] << ' '; }
void sort(int a,int n) int i,j,tmp; bool flag; for (i=1;i<n;++i) {flag false; for (j=0;j<n-i;++j) if comp(&a[j+1],&a[j] W/a[j+1]a[j] (tmp a[j];a[]a[j+1];a[j+1]=tmp;flag true;} if(!flag)break;*一趟冒泡中没有发生交换,排序结束*/ cout <endl; for (i=0;i<n;++i)cout <a[i]<'' 子 LoCCS
void sort(int a[], int n) { int i, j, tmp; bool flag; for (i=1; i<n; ++i) {flag = false; for (j=0; j<n-i; ++j) if ( comp( &a[j+1], &a[j] ) //a[j+1] < a[j] {tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; flag = true;} if (!flag) break;/* 一趟冒泡中没有发生交换,排序结束*/ } cout << endl; for (i=0; i<n; ++i) cout << a[i] << ' '; }
⑧ struct User { char *name; int dept; ; User heads[]={ “Alice”,10, Bob”,5, “Carol'',1 ; LoCCS
struct User { char *name; int dept; }; User heads[ ]={ “Alice” , 10, “Bob” , 5, “ Carol” , 1 };
int (*comp)(const void *const void *) void sort(User a[]int n,int (*comp)(const void *const void *) f int i,j; User tmp; bool flag; for (i=1;i<n;++i) {flag false; for (j=0;j<n-i;++j) if comp(&a[j+1],&a[]) {tmp a[];a[j]=a[j+1];a[j+1]tmp;flag true;} if(flag)break;一趟冒泡中没有发生交换,排序结束*! cout <endl; for (i=0;i<n;++i)cout <a[i].name <'In'; 3 LoCCS
int (*comp) (const void * , const void *); void sort(User a[ ], int n, int (*comp) (const void * , const void *)) { int i, j; User tmp; bool flag; for (i=1; i<n; ++i) {flag = false; for (j=0; j<n-i; ++j) if ( comp( &a[j+1], &a[j] )) {tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; flag = true;} if (!flag) break;/* 一趟冒泡中没有发生交换,排序结束*/ } cout << endl; for (i=0; i<n; ++i) cout << a[i].name << '\n'; }
int comp1(const void *p,const void *q) if(strcmp(static_cast(p)->name, static_cast(q)->name)(p)->dept- static_cast(q)->dept <0)return 1; return 0; LoCCS
int comp1 (const void *p, const void *q) { if (strcmp(static_cast(p) ->name, static_cast(q) ->name)(p)->dept- static_cast(q)->dept <0) return 1; return 0; }