// 版权所有 (C)2007, ***(成都)有限公司。 // // 描述: //作业4.3:排序和二分查找(从小到大排序) //将strList排序,需写出三种排序算法(冒泡排序、插入排序、快速排序) //然后查找字符串,需写出两种查找算法(顺序查找算法、二分查找算法) // // 作者:陈进宇 chenjinyu_china@yeah.net // 日期:start:2009/3/6 end:2009/3/ #include <iostream> #include <string.h> #include <stdlib.h> void OrderBubble(char *strList[], int size);//冒泡排序 void OrderQuick(char *strList[], int first,int last);//快速排序 void OrderInsert(char *strList[], int size);//插入排序 void OrderInsert_A(char *strList[],int size); int OrderFindStr(char *strList[], int size, char *str);//顺序查找字符串 int DichFindStr(char *strList[], int size, char *str);//二分法查找字符串 int main(int argc, char **argv) { int index; char *strArray[11]; strArray[0]="abcty"; strArray[1]="z52xf"; strArray[2]="d5bc"; strArray[3]="cxa3z"; strArray[4]="wz678f"; strArray[5]="aaa98"; strArray[6]="cdeuih"; strArray[7]="oiwuer"; strArray[8]="98a78"; strArray[9]="nn89n"; strArray[10]="mam"; //OrderBubble(strArray, 11); OrderQuick(strArray,0,10); //OrderInsert(strArray,11); index = DichFindStr(strArray, 11, "mam"); printf("find result: %d/n", index); if(index > 0) { printf("find str:%s/n", strArray[index]);//strArray[index] + 1 是第index里数组指针向前+1,指向字符串下一个字母,不是指向下一个字符串首地址 } for(int i = 0 ;i < 11;i++ ) { printf("%s/n",strArray[i]); } } //(冒泡排序) void OrderBubble(char *strList[], int size) { char *temp; for(int i = 0; i < size - 1; i ++) { for(int j = size-1; j > i; j --) { if(strcmp(*(strList + j - 1),*(strList + j)) > 0) { temp = *(strList + j); *(strList + j) = *(strList + j -1); *(strList + j -1) = temp; } } } } //(插入排序) void OrderInsert(char *strList[], int size) { for(int i = 0 ;i < size -1;i++) { int mini = i; for(int j = i + 1; j < size ; j++) { if(strcmp(*(strList + j),*(strList + mini)) < 0) mini = j; } if(mini != i) { char *temp ; temp = *(strList + i); *(strList + i) = strList[mini]; strList[mini] = temp; } } } //void OrderInsert_A(char *strList[],int size) //{ // char *mini; // for(int i = 0;i < size -1; i++) // { // mini = strList[i]; // for(int j = i + 1;j < size ;j ++) // { // if(strcmp(strList[j],strList[i]) < 0) // mini = strList[j]; // //mini = *(strList + j); // } // if(strcmp(strList[i],mini) > 0) // { // char *temp; // temp = strList[i]; // strList[i] = mini; // mini = temp; // /* temp = *(strList + i); // *(strList + i) = mini; // mini = temp;*/ // } // } //} //(快速排序) void OrderQuick(char *strList[], int first,int last) { int low,high; char *list_separator; char *temp; low = first; high = last; list_separator = strList[(first + last)/2]; do { while(strcmp(*(strList + low),list_separator) < 0) low ++; while(strcmp(*(strList + high),list_separator) > 0) high --; if(low <= high) { temp = *(strList + low); *(strList + low++) = *(strList + high); *(strList + high--) = temp; } } while(low <= high); if(first < high) OrderQuick(strList,first,high); if(low < last) OrderQuick(strList,low,last); } //查找字符串,需写出两种查找算法(顺序查找算法、二分查找算法) int OrderFindStr(char *strList[], int size, char *str)//顺序查找算法 { //返回查找到字符串的索引号,失败返回-1 for(int t = 0; t < size; t++) { if(*strList[t] == *str) { return t; } } return -1; } int DichFindStr(char *strList[], int size, char *str)//二分查找算法 { int low,high = size -1; int i = (low +high) >> 1; for(;;) { int mini = strcmp(str,strList[i]); if(mini > 0 ) { if(low == i) break; low = i; } else if(mini < 0 ) { high = i; } else { return i; } i = ( low + high ) >> 1; } if(strcmp(str,strList[high]) < 0) return high; return -1; }