#include <iostream>
using namespace std ;
//快速排序(Quick Sort)是对冒泡排序的一种改良。它的基本思想是通过一趟排序将待排记录分割成独立的两部分,
//其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序.#define MAXSIZE 20 //存储元素的顺序表的最大长度
typedef int KeyType ; //关键字类型
typedef int InfoType ; //其他数据项类型typedef struct {
KeyType key ;
InfoType otherinfor ; //其他数据项
} RedType ;typedef struct {
RedType r[ MAXSIZE + 1 ] ; //r[0]闲置或用作哨兵单元
int length ; //顺序表长度
} SqList ; //顺序表类型void InPut( SqList &L )
{
int value = 0 ;
int i = 1 ;
while( i < ( MAXSIZE + 1 ) )
{
cin >> value ;
if( value == -1 ) //以-1为结束符
break ;
L.r[ i ++ ].key = value ;
}
L.length = i - 1 ;
}int Partition( SqList &L , int low , int high )
{ //交换顺序表L中子表r[low…high]的记录,枢轴(pivot)记录到位,并返回其所在位置// bool changelow = false ;
// bool changehigh = false ; //优化一。此种类似于冒泡排序中的改进需要在函数参数表中设置bool变量,便于下面QSort()的调用以及处理。并且优化一和优化二同时使用时,需要好好处理两者的关系。int pivotkey = L.r[ low ].key ; //枢轴记录关键字
L.r[ 0 ] = L.r[ low ] ; //用子表的第一个记录作枢轴记录while( low < high ) //从表的两端交替地向中间扫描
{
while( low < high && ( L.r[ high ].key >= pivotkey ) )
-- high ;
L.r[ low ] = L.r[ high ] ;while( low < high && ( L.r[ low ].key <= pivotkey ) )
++ low ;
L.r[ high ] = L.r[ low ] ;
}
L.r[ low ] = L.r[ 0 ] ; //枢轴记录到位
return low ; //返回枢轴位置
}void QSort( SqList &L , int low , int high )
{ //对顺序表中L中的子序列L.r[low…high]作快速排序
int pivotloc ;if( low < high ) //长度大于1.
{
pivotloc = Partition( L , low , high ) ;//将序列一分为二
if( pivotloc < ( L.length - pivotloc + 1 ) )//对程序性能的优化(二):先对长度短的子序列进行快速排序。(详细原因参见书本P227)
{
QSort( L , low , pivotloc - 1 ) ; //对低子表递归排序
QSort( L , pivotloc + 1 , high ) ; //对高子表递归排序
}
else
{
QSort( L , pivotloc + 1 , high ) ;
QSort( L , low , pivotloc - 1 ) ;
}
}
}void QuickSort( SqList &L )
{ //对顺序表L作快速排序
QSort( L , 1 , L.length ) ;
}void OutPut( SqList L )
{
for( int i = 1 ; i < L.length + 1 ; ++ i )
{
cout << L.r[ i ].key << ' ' ;
}
cout << endl ;
}int main( )
{
SqList L ;InPut( L ) ; //49 38 65 97 76 13 27 49 -1(结束符)
QuickSort( L ) ;
OutPut( L ) ;return 0 ;
}
第十章(7).选择排序
最新推荐文章于 2020-06-09 22:56:48 发布