问答题

【说明】下面是一个用C编写的快速排序算法。为了避免最坏情况,取基准记录pivot时,采用从left、right和mid=[(left+right)/2]中取中间值,并交换到right位置的办法。数组a存放待排序的一组记录,数据类型为T,left和right是待排序子区间的最左端点和最右端点。 void quicksort (int a[], int left, int right) { int temp; if (left<right) { hat pivot = median3 (a, left, right); //三者取中子程序 int i = left, j = right-1; for(;;){ while (i <j && a[i] < pivot) i++; while (i <j && pivot < a[j]) j--; if(i<j){ temp = a[i]; a[j] = a[i]; a[i] = temp; i++; j--; } else break; } if (a[i] > pivot) {temp = a[i]; a[i] = a[right]; a[right] = temp;} quicksort( (1) ); //递归排序左子区间 quieksort(a,i+1 ,right); //递归排序右子区间 } } void median3 (int a[], int left, int right) { int mid= (2) ; int k = left; if(a[mid] < a[k])k = mid; if(a[high] < a[k]) k = high; //选最小记录 int temp = a[k]; a[k] = a[left]; a[left] = temp; //最小者交换到 left if(a[mid] < a[right]) {temp=a[mid]; a[mid]=a[right]; a[right]=temp;} } 消去第二个递归调用 quicksort (a,i+1,right)。 采用循环的办法: void quicksort (int a[], int left, int right) { int temp; int i,j; (3) { int pivot = median3(a, left, right); //三者取中子程序 i = left; j = righi-1; for (;; ){ while (i<j && a[i] < pivot)i++; while (i<j && pivot <a[j]) j--; if(i <j) { temp = a[i]; a[j]; = a[i]; a[i]=temp; i++; j--; } else break; } if(a[i]>pivot){ (4) ;a[i]=pivot;} quicksoft ( (5) ); //递归排序左子区间 left = i+1; } }

【参考答案】

[解析] (1)a,left,i-1 递归排序左子区间,从left到i-1元素,不包括i元素。 (2)(left+rig......

(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)
热门 试题

问答题
【说明】本程序将两个从小到大的有序链表合成一个新的从小到大的有序链表。链表的每一项由类Node描述,而链表由类List描述。类List的成员函数有以下几个。①createList():创建从小到大的有序链表。②multiplyList(List L1,List L2):将链表L1和链表L2合并。③print();打印链表。# include <iostream.h>class List;class Node {friend class List;public:Node(int data){ (1) ; }private:int data;Node *next; };class List {public:List( ) {list = NULL;}void multiplyList(List L1, List L2);void createList( );void print( );private:Node *list;};void List::createList( ){ Node *p, *u, *pm;int data;list = NULL;while (1) { cout<< 输入链表的一项: (小于零,结束链表) <<end1;cin >> data;if(data<0)break; 小于零,结束输入p = list;while (p != NULL && data > p->data) 查找插入点{ pre = p;p = p->next;}u= (2) :if(p==list)list = u;elsepre->next = u;(3) :}void List::multiplyList (List L1, List L2){ Node *pL1, *pL2, *pL, *u;list = NULL;pL1 = L1.list;pL2 = L2.1ist;while (pL1 != NULL && pL2!= NULL){if (pL1->data < pL2->data){ u = new Node (pL1->data);pL1 = pL1 ->next;}else{ u = new Node (pL2->data));pL2 = pL2->next;}if (list==NULL)list= (4) ;else{ pL->next = u;pL =u;}}pL1 = (pL1 != NULL) pL1:pL2;while (pL1 != NULL){ u = (5) ;pL1 = pL1->next;if (list==NULL)list=pL=u;else{ pL->next = u;pL = u;}}}void List::print( ){ Node *p;p = list;while (p != NULL){ cout << p->data << t ;p = p->next;}cout << end1;}void main ( ){ List L1, L2, L;cout << 创建第一个链表 n ; L1.createList ( );cout << 创建第二个链表 n ; L2.createList ( );L1.print ( ); L2.print ( );L.multiplyList (L1, L2);L.print ( );}