冒泡排序,快速排序,简单选择排序

既然选择了远方,便只顾风雨兼程。

#include<iostream>
using namespace std;

#define MAX 20
typedef int SqList[MAX];

void BubbleSort(SqList &L,int n)//冒泡排序,使用交换
{
	for(int i=0;i<n-1;++i)//控制趟数
	{
		for(int j=0;j<n-i-1;++j)//每一趟相邻两个记录比较,只需进行n-i次即可
		{
		    if(L[j]>L[j+1])//判断
			{
				int temp=L[j];
				L[j]=L[j+1];
				L[j+1]=temp;
			}
		}
	}
}

int Partition(SqList &L,int low,int high)//使用赋值
{
	//交换顺序表L中子表L[low,high]的记录,枢轴记录到位,并返回其所在位置
	//此时,在它前(后)的记录均不大(小)于它
	int key=L[low];
	while(low<high)
	{
		while(low<high && L[high]>=key)//右边大于枢轴
		{
			high--;//向左比较
		}
		L[low]=L[high];//若不满足,则赋值
		while(low<high && L[low]<=key)//左边小于枢轴
		{
			low++;//向右比较
		}
		L[high]=L[low];//若不满足,则赋值
	}
	L[low]=key;
	return low;

}

void QuickSort(SqList &L,int low,int high)//快速排序,使用递归形式
{
    if(low<high)//长度大于1
	{
        int pivotloc=Partition(L,low,high);//一分为二
		QuickSort(L,low,pivotloc-1);//对低子表递归排序,pivotloc是枢轴
		QuickSort(L,pivotloc+1,high);//对高子表递归排序
	}
}

int SelectMinKey(SqList &L,int n ,int key)           //选择第key小的下标
{
    for(int k = key+1;k < n;++k)                  //只比较key之后的  
    {  
        if(L[k] < L[key])                         //若小于则记录下标  
        {  
            key = k;  
        }  
    }  
    return key;                                   //返回下标  
}  


void SelectSort(SqList &L,int n)//简单选择排序
{
	for(int i=1;i<n-1;++i)
	{
		 int j=SelectMinKey(L,n,i);

			if(i!=j)
			{
                int temp=L[i];
				L[i]=L[j];
				L[j]=temp;
			}
	}
}


void main()
{
	SqList sq={0,49,38,65,97,76,13,27,49};
	for(int i=1;i<9;++i)
	{
		cout<<sq[i]<<" ";
	}
	cout<<endl;
	SqList sq2={49,38,65,97,76,13,27,49};
	for(i=0;i<8;++i)
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;
	BubbleSort(sq2,8);
	for(i=0;i<8;++i)
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;
	QuickSort(sq2,0,7);
	for(i=0;i<8;++i)
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;
	SelectSort(sq2,8);
     for(i=0;i<8;++i)
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;



}
   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值