1、/Insert_Sort1 10.24 void BiInsert_Sort(SqList &L)/二路插入排序的算法int dMAXSIZE; /辅助存储x=L.r.key;d=x;first=1;final=1;for(i=2;ij-)dj+1=dj;dj+1=L.ri.key;final+;else /插入后部for(j=first;djj+)dj-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+
2、)/将序列复制回去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; /建初始循环链表i+) /逐个插入p=0;x=L.ri.key;while(L.rL.rp.next.keyx&L.rp.next)p=L.rp.next;q=L.rp.next;L.rp.next=i;L.ri.next=q;p=L.r0.next;for(i=1;L.length;i+) /重排记录的位置while(pi) p=L.rp.next;if(p
3、!=i)L.rpL.ri;L.ri.next=p;p=q;/SLInsert_Sort 10.26 void Bubble_Sort1(int a ,int n)/对包含n个元素的数组a进行改进的冒泡排序change=n-1; /change指示上一趟冒泡中最后发生交换的元素while(change)for(c=0,i=0;change;if(aiai+1)aiai+1;c=i+1; /c指示这一趟冒泡中发生交换的元素change=c;/while/Bubble_Sort1 10.27 void Bubble_Sort2(int a ,int n)/相邻两趟是反方向起泡的冒泡排序算法low=0
4、;high=n-1; /冒泡的上下界change=1;while(lowlow;i-) /从下向上起泡if(aiai-1)ai-1;low+; /修改下界/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为向下while(b00) /注意这个交换条件ai+d;b1+d-=d; /修改边界d*=-1; /换个方向/Bubble_Sort3 10.29 void
5、OE_Sort(int a ,int n)/奇偶交换排序的算法while(change) n-1;i+=2) /对所有奇数进行一趟比较for(i=0;i+=2) /对所有偶数进行一趟比较/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类型!StackEmpty(S) /注
6、意排序结束的条件if(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(lowhigh-low=pivotkey)L.rlow=L.rhigh;L.rlow.keyL.rhigh.key) L.rlowL.rhigh;else /子序列含有三个元素L.rlow+1.key) L.rlowL.rhigh.key) L.rlow+1=0) high-; /以0作为虚拟的枢轴记录alowahigh;0) low+;ahigh
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1