传统的选择法排序是对换法,想起在内存并不紧张的情况下,使用复制法会怎么样呢?
下面是复制法的代码:
- //用指针数组处理字符串
- main(){
- void sort2(char *name1[],char *name2[],int n);
- void print(char *name[],int n);
- char *brand[] = {"LENOVO","FOUNDER","ACER","BENQ","HP","IBM"};
- char *brand2[6];
- sort2(brand,brand2,6);
- print(brand2,6);
- }
- void sort2(char *name1[],char *name2[],int n){
- int i,j,k,m = 0;
- k = 0;
- for(i = 0; i < n; i++){
- for(j = 0; j < n; j++){
- if(name1[j] != 0){
- k = j;
- break;
- }
- }
- for(j = k + 1; j < n; j++){
- if(name1[j] != 0){
- if(strcmp(name1[k],name1[j]) > 0) k = j;
- }
- }
- name2[m++] = name1[k];
- name1[k] = 0;
- }
- }
- void print(char *name[], int n){
- int i;
- for(i = 0; i < n; i++){
- printf("%s/n",name[i]);
- }
- }
在来看看传统的选择法:
- //用指针数组处理字符串
- main(){
- void sort(char *name[],int n);
- void print(char *name[],int n);
- char *brand[] = {"LENOVO","FOUNDER","ACER","BENQ","HP","IBM"};
- sort(brand,6);
- print(brand,6);
- }
- void sort(char *name[],int n){
- char *p;
- int i,j,k;
- for(i = 0; i < n; i++){
- k = i;
- for(j = i + 1; j < n; j++){
- if(strcmp(name[k],name[j]) > 0) k = j;
- }
- if(k != i){
- p = name[i]; name[i] = name[k]; name[k] = p;
- }
- }
- }
- void print(char *name[], int n){
- int i;
- for(i = 0; i < n; i++){
- printf("%s/n",name[i]);
- }
- }
谁的效率高一点呢?
各排序10000000次,耗时比较:
新:4.578s
旧:3.796s
还是传统的效率要高一些。