资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第十章 内部排序 10.23 void Insert_Sort1(SqList &L)/监视哨设在高下标端的插入排序算法k=L.length;for(i=k-1;i;-i) /从后向前逐个插入排序if(L.ri.keyL.ri+1.key)L.rk+1.key=L.ri.key; /监视哨for(j=i+1;L.rj.keyL.ri.key;+j)L.rj-1.key=L.rj.key; /前移L.rj-1.key=L.rk+1.key; /插入/Insert_Sort1 10.24 void BiInsert_Sort(SqList &L)/二路插入排序的算法int dMAXSIZE; /辅助存储x=L.r .key;d =x;first=1;final=1;for(i=2;i=x) /插入前部for(j=final;djL.ri.key;j-)dj+1=dj;dj+1=L.ri.key;final+;else /插入后部for(j=first;djdj-1=dj;d(j-2)%MAXSIZE+1=L.ri.key;first=(first-2)%MAXSIZE+1; /这种形式的表达式是为了兼顾first=1的情况/forfor(i=first,j=1;di;i=i%MAXSIZE+1,j+)/将序列复制回去L.rj.key=di;/BiInsert_Sort 10.25 void SLInsert_Sort(SLList &L)/静态链表的插入排序算法L.r0.key=0;L.r0.next=1;L.r1.next=0; /建初始循环链表for(i=2;i=L.length;i+) /逐个插入p=0;x=L.ri.key;while(L.rL.rp.next.keyp=L.rp.next;q=L.rp.next;L.rp.next=i;L.ri.next=q;/forp=L.r0.next;for(i=1;iwhile(pq=L.rp.next;if(p!=i)L.rpL.ri;L.ri.next=p;p=q;/for/SLInsert_Sort 10.26 void Bubble_Sort1(int a ,int n)/对包含n个元素的数组a进行改进的冒泡排序change=n-1; /change指示上一趟冒泡中最后发生交换的元素while(change)for(c=0,i=0;iif(aiai+1)aiai+1;c=i+1; /c指示这一趟冒泡中发生交换的元素change=c;/while/Bubble_Sort1 10.27 void Bubble_Sort2(int a ,int n)/相邻两趟是反方向起泡的冒泡排序算法low=0;high=n-1; /冒泡的上下界change=1;while(lowchange=0;for(i=low;iif(aiai+1)aiai+1;change=1;high-; /修改上界for(i=high;ilow;i-) /从下向上起泡if(aiaiai-1;change=1;low+; /修改下界/while/Bubble_Sort2 10.28 void Bubble_Sort3(int a ,int n)/对上一题的算法进行化简,循环体中只包含一次冒泡int b 3 ; /b0为冒泡的下界,b 2 为上界,b1无用d=1;b0=0;b 2 =n-1; /d为冒泡方向的标识,1为向上,-1为向下change=1;while(b0change=0;for(i=b1-d;i!=b1+d;i+=d) /统一的冒泡算法if(ai-ai+d)*d0) /注意这个交换条件aiai+d;change=1;b1+d-=d; /修改边界d*=-1; /换个方向/while/Bubble_Sort3 10.29 void OE_Sort(int a ,int n)/奇偶交换排序的算法change=1;while(change) change=0;for(i=1;iif(aiai+1)aiai+1;change=1;for(i=0;iif(aiai+1)aiai+1;change=1;/while/OE_Sort 分析:本算法的结束条件是连续两趟比较无交换发生10.30 typedef struct int low;int high; boundary; /子序列的上下界类型 void QSort_NotRecurve(int SQList &L)/快速排序的非递归算法low=1;high=L.length;InitStack(S); /S的元素为boundary类型while(lowif(high-low2) /如果当前子序列长度大于3且尚未排好序pivot=Partition(L,low,high); /进行一趟划分if(high-pivotpivot-low)Push(S,pivot+1,high); /把长的子序列边界入栈high=pivot-1; /短的子序列留待下次排序elsePush(S,low,pivot-1);low=pivot+1;/ifelse if(lowEasy_Sort(L,low,high); /直接进行比较排序low=high; /当前子序列标志为已排好序else /如果当前子序列已排好序但栈中还有未排序的子序列Pop(S,a); /从栈中取出一个子序列low=a.low;high=a.high;/while/QSort_NotRecurve int Partition(SQList &L,int low,int high)/一趟划分的算法,与书上相同L.r0=L.rlow;pivotkey=L.rlow.key;while(lowwhile(low=pivotkey)high-;L.rlow=L.rhigh;while(lowlow+;L.rhigh=L.rlow;/whileL.rlow=L.r0;return low;/Partition void Easy_Sort(SQList &L,int low,int high)/对长度小于3的子序列进行比较排序if(high-low=1) /子序列只含两个元素if(L.rlow.keyL.rhigh.key) L.rlowL.rhigh;else /子序列含有三个元素if(L.rlow.keyL.rlow+1.key) L.rlowL.rlow+1;if(L.rlow+1.keyL.rhigh.key) L.rlow+1L.rhigh;if(L.rlow.keyL.rlow+1.key) L.rlowL.rlow+1;/Easy_Sort 10.31 void Divide(int a ,int n)/把数组a中所有值为负的记录调到非负的记录之前low=0;high=n-1;while(lowwhile(low=0) high-; /以0作为虚拟的枢轴记录alowahigh;while(lowalowahigh;/Divide 10.32 typedef enum RED,WHITE,BLUE color; /三种颜色 void Flag_Arrange(color a ,int n)/把由三种颜色组成的序列重排为按照红,白,蓝的顺序排列i=0;j=0;k=n-1;while(j=k)switch(aj)case RED:aiaj;i+;j+;break;case WHITE:j+;break;case BLUE:ajak;k-; /这里没有j+;语句是为了防止交换后aj仍为蓝色的情况/Flag_Arrange分析:这个算法中设立了三个指针.其中,j表示当前元素;i以前的元素全部为红色;k以后的元素全部为蓝色.这样,就可以根据j的颜色,把其交换到序列的前部或者后部. 10.33 void LinkedList_Select_Sort(LinkedList &L)/单链表上的简单选择排序算法for(p=L;p-next-next;p=p-next)q=p-next;x=q-data;for(r=q,s=q;r-next;r=r-next) /在q后面寻找元素值最小的结点if(r-next-datax=r-next-data;s=r;if(s!=q) /找到了值比q-data更小的最小结点s-nextp-next=s-next;s-next=q;t=q-next;q-next=p-next-next;p-next-next=t; /交换q和s-next两个结点/for/LinkedList_Select_Sort 10.34 void Build_Heap(Heap &H,int n)/从低下标到高下标逐个插入建堆的算法for(i=2;i /此时从H.r1到H.ri-1已经是大顶堆j=i;while(j!=1) /把H.ri插入k=j/2;if(H.rj.keyH.rk.key)H.rjH.rk;j=k;/for/Build_Heap 10.35 void TriHeap_Sort(Heap &H)/利用三叉树形式的堆进行排序的算法for(i=H.length/3;i0;i-)Heap_Adjust(H,i,H.length);for(i=H.length;i1;i-)H.r1H.ri;Heap_Adjust(
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号