该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
近来看了张智华的《Pascal程序设计》,看到两个例子非常棒,就和大家一起分享。对你没有看错,是Pascal写的,事实上我用的最多的是DELPHI,但C和C++也是我的最爱。
原例题在VC++6.0上通过。Console工程编译通过。
//程序名称:常用排序法练习(升序)
//练习者 :Jack Chen
//开发日期:202.4.08
//最后修改:202.4.13
///
#include
#include
int a[20]; //待排序数组
int SetData(); //给数组设定初值
bool PositionExchange(int *p,int *q ); //两个数据换位
bool SelectSort(int *p,int iLength); //选择排序
bool SelectSortPro(int *p,int iLength); //改进的选择排序法
bool BubgbleSort(int *p,int iLength); //冒泡法排序
bool BubgbleSortPro(int *p,int iLength); //改进的冒泡法排序
int main(int argc, char *argv[])
{
// 一、数据初始化
SetData();
printf("\n\n 1、排序之前的数据:\n");
//二、显示初始数据情况
for (int i=0; i<20; i++)
{
printf("%d ",a[i]);
}
//三、通过排序函数排序
//SelectSort(&a[0],20); //选择排序
//SelectSortPro(&a[0],20); //选择排序
//BubgbleSort(a,20); //冒泡法选择排序
BubgbleSortPro(a,20); //冒泡法选择排序
//四、显示排序结果
printf("\n\n 2、排序之后的数据:\n");
for (int j=0; j<20; j++)
{
printf("%d ",a[j]);
}
printf("\n\n");
system("PAUSE");
return 0;
}
int SetData()
{
a[0]=52;
a[1]=16;
a[2]=110;
a[3]=81;
a[4]=51;
a[5]=91;
a[6]=21;
a[7]=421;
a[8]=61;
a[9]=191;
a[10]=381;
a[11]=66;
a[12]=1;
a[13]=18;
a[14]=59;
a[15]=90;
a[16]=31;
a[17]=38;
a[18]=46;
a[19]=68;
return 1;
}
bool PositionExchange(int *iPoint1,int *iPoint2 ) //两个数据换位
{
int tmp;
tmp=*iPoint1;
*iPoint1=*iPoint2;
*iPoint2=tmp;
return true;
}
bool SelectSort(int *p,int iLength) //选择排序
{
int i,j;
for( i=0; i
{
for( j=i+1; j
{
if ( *(p+i)> *(p+j) ) PositionExchange(p+i,p+j);
} //for j
}//for i
return true;
}
bool SelectSortPro(int *p,int iLength) //改进的选择排序
{
int i,j,k;
for( i=0; i
{
k=i;
for( j=i+1; j
{
if ( *(p+k)> *(p+j) ) k=j; //记录小的位置
}
if (i!=k ) PositionExchange( p+i,p+k );
}//for i
return true;
}
bool BubgbleSort(int *p,int iLength) //冒泡法选择排序
{
int i,j ;
for( i=0; i
{
for( j=0; j
{
if ( *(p+j)>*(p+j+1) ) //每一次和下一个位置的值进行比较
PositionExchange(p+j,p+j+1);
} //for j
}//for i
return true;
}
bool BubgbleSortPro(int *p,int iLength) //改进的冒泡法选择排序
{
int i,j;
int Flag; //设定是否的交换标置
for( i=0; i
{
Flag= 1; //先设定循环有中止标置
for( j=0; j
{
if ( *(p+j)>*(p+j+1) ) //每一次和下一个位置的值进行比较
{
PositionExchange(p+j,p+j+1);
Flag=0; //如果有位置交换,说明还没有排序好,循环可以再进行下去
}
} //for j
if (Flag==1) break; //for J 的循环体没有执行,说明已经排好了不要再排了
}//for i
return true;
}