交换排序----冒泡排序 和 快速排序

通过对比大小交换对比的元素所得到的排序为交换排序。冒牌排序时很常见的:通过对比相邻元素的大小如果前面的元素比后面的大,则交换两个元素,使得大的元素往后移。
一、冒泡排序

template void BubbleSort(SqList &L) //1)冒泡排序 { #ifdef CHANGE_FLAG bool changeFlag=false; #endif T t; for(int i=1;i { #ifdef CHANGE_FLAG changeFlag=false; #endif for(int j=1;j { if(L.key[j]>L.key[j+1]) { t=L.key[j]; L.key[j]=L.key[j+1]; L.key[j+1]=t; #ifdef CHANGE_FLAG if(!changeFlag) changeFlag=true; #endif } } #ifdef CHANGE_FLAG if(changeFlag) break; #endif } }

二、快速排序,本文重点
快速排序在一次排序中有两个方向,一个是从尾部向前(逆向),一个是从首部标志(不包括首部标志)向后(正向),正向和逆向不能相遇,相遇则终止{while(low
流程:
取第一个数为标志,逆向比较是否大于等于这个值,大于等于则继续逆向,如果小于则终止逆向,将这个值赋给标志位出(L.key[low]=L.key[high];)。
正向比较low+1开始,比较值是否小于等于标志值,小于等于则继续正向,如果大于标志值则终止正向,将这个值赋给刚才的高位(L.key[high]=L.key[low];)。
当前的low位便是标志位,low之前的数据都是小于等于标志数据的,low之后的数据都是大于等于标志数据的。所以最后将low位的数据置为标志数据(L.key[low]=L.key[0], Key[0]用来保存交换数据)。low便是分开标志位。
递归调用:
通过递归的调用进行快速排序,递归的继续条件是{if(low< high)},也就是终止条件是low>=high。

//快速排序 template int Partition(SqList&L,int low,int high) { T pivotkey; L.key[0]=L.key[low]; pivotkey=L.key[low]; while(low { while(lowpivotkey) --high; L.key[low]=L.key[high]; while(low<=pivotkey) ++low; L.key[high]=L.key[low]; } L.key[low]=L.key[0]; Output(L); return low; } template void QSort(SqList &L, int low, int high) { int mid; if(low { mid=Partition(L,low,high); QSort(L,low,mid-1); QSort(L,mid+1,high); } } template void QuikSort(SqList&L) { QSort(L,1,L.length); }

PS:template 后面跟有 < class T > ,这个编辑器自动把它屏蔽了,可能是怕和css样式格式混淆之类~交换排序----冒泡排序 和 快速排序