码迷,mamicode.com
首页 > 编程语言 > 详细

排序:快速排序与选择排序

时间:2015-06-17 07:08:33      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:c语言   快速排序   冒泡排序   选择排序   数据结构   

       在最近的学习中,对于排序算法进行了一定的学习,在这里对快速排序和选择排序的部分内容进行说明,其余内容在后期会进行补充,感谢大家提出宝贵意见。


宏定义如下:

<strong><span style="font-size:18px;">#include <iostream>
using namespace std;

#define M 21

typedef int SqList[M];</span></strong>

一.冒泡排序

<strong><span style="font-size:18px;">void BubbleSort(SqList &L,int n)                  //冒泡排序
{
	for(int i = 0;i < n;++i)                      //外层循环记录循环次数
	{
		for(int j = 0;j < n-i-1;++j)              //内层循环记录每一次循环比较的次数
		{                                         //(j<n-i-1)比较一次后,其后值不参与再比较
			if(L[j] > L[j+1])                     //若前者大于后者,则交换位置
			{
				int tmp = L[j];
				L[j] = L[j+1];
				L[j+1] = tmp;
			}
		}
	}
}</span></strong>

二.快速排序

<strong><span style="font-size:18px;">//改进方式,直接赋值
int Partition(SqList &L,int low,int 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;                                 //此时low = high,即可等价为L[high] = key,枢轴记录到位
	return low;                                   //返回此时位置
}

//交换方式
/*int Partition(SqList &L,int low,int high)
{
	int key = L[low];
	while(low < high)
	{
		while(low < high && L[high] >= key )
		{
			high--;
		}
		int tmp = L[low];
		L[low] = L[high];
		L[high] = tmp;
		while(low < high && L[low] <= key)
		{
			low++;
		}
		tmp = L[low];
		L[low] = L[high];
		L[high] = tmp;
	}
	return low;
}*/

void QuickSort(SqList &L,int low,int high)        //快速排序
{
	if(low < high)
	{
		int prvitloc = Partition(L,low,high);     //将数组一分为二
		QuickSort(L,low,prvitloc-1);              //左半部分排序
		QuickSort(L,prvitloc+1,high);             //右半部分排序
	}
}</span></strong>

三.简单选择排序

<strong><span style="font-size:18px;">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 = 0;i < n-1;++i)
	{
		int j = SelectMinKey(L,n,i);              //第key小的记录位置
		if(i != j)                                //若不为此位置数,则交换位置
		{
			int tmp = L[i];
			L[i] = L[j];
			L[j] = tmp;
		}
	}
}</span></strong>

具体代码如上,如有任何问题请大家指出,谢谢。


如下附上完整版函数和测试代码:

<strong><span style="font-size:18px;">#include <iostream>
using namespace std;

#define M 21

typedef int SqList[M];

void BubbleSort(SqList &L,int n)                  //冒泡排序
{
	for(int i = 0;i < n;++i)                      //外层循环记录循环次数
	{
		for(int j = 0;j < n-i-1;++j)              //内层循环记录每一次循环比较的次数
		{                                         //(j<n-i-1)比较一次后,其后值不参与再比较
			if(L[j] > L[j+1])                     //若前者大于后者,则交换位置
			{
				int tmp = L[j];
				L[j] = L[j+1];
				L[j+1] = tmp;
			}
		}
	}
}

//改进方式,直接赋值
int Partition(SqList &L,int low,int 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;                                 //此时low = high,即可等价为L[high] = key,枢轴记录到位
	return low;                                   //返回此时位置
}

//交换方式
/*int Partition(SqList &L,int low,int high)
{
	int key = L[low];
	while(low < high)
	{
		while(low < high && L[high] >= key )
		{
			high--;
		}
		int tmp = L[low];
		L[low] = L[high];
		L[high] = tmp;
		while(low < high && L[low] <= key)
		{
			low++;
		}
		tmp = L[low];
		L[low] = L[high];
		L[high] = tmp;
	}
	return low;
}*/

void QuickSort(SqList &L,int low,int high)        //快速排序
{
	if(low < high)
	{
		int prvitloc = Partition(L,low,high);     //将数组一分为二
		QuickSort(L,low,prvitloc-1);              //左半部分排序
		QuickSort(L,prvitloc+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 = 0;i < n-1;++i)
	{
		int j = SelectMinKey(L,n,i);              //第key小的记录位置
		if(i != j)                                //若不为此位置数,则交换位置
		{
			int tmp = L[i];
			L[i] = L[j];
			L[j] = tmp;
		}
	}
}
void main()
{
	SqList sq2 = {53,24,35,56,32,78,99}; 
	for(int i = 0;i < 7; ++i)                    //打印sq2
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;
	BubbleSort(sq2,7);                          //冒泡排序结果打印
	for(i = 0;i < 7; ++i)
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;
	QuickSort(sq2,0,6);                         //快速排序
	for(i = 0;i < 7; ++i)
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;
	SelectSort(sq2,7);                         //简单选择排序
	for(i = 0;i < 7; ++i)
	{
		cout<<sq2[i]<<" ";
	}
	cout<<endl;
}</span></strong>



排序:快速排序与选择排序

标签:c语言   快速排序   冒泡排序   选择排序   数据结构   

原文地址:http://blog.csdn.net/qaz3171210/article/details/46527083

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!