第十章(7).选择排序

来源:互联网 发布:盛世赢家软件下载 编辑:程序博客网 时间:2024/05/17 01:28

#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 ;
}


0 0
原创粉丝点击