排序算法总结

本节对一些简单的排序算法做了一个学习,对于个人认为比较难的对排序和基数排序,作者尚未学习完成,因此需要进一步学习的人可以参考:http://blog.youkuaiyun.com/talking12391239/article/details/9079961http://blog.youkuaiyun.com/yangzl2008/article/details/10344065http://hxraid.iteye.com/blog/646760

#include<iostream>
using namespace std;

//1.插入排序
void insertSort(int num[],int len);
//2.希尔排序或者自动增量排序
void shellSort(int* num,int len);
//3.冒泡排序
void bubbleSort(int* num,int len);
//4.快速排序
int oneQuikSort(int* num,int low ,int high);
void quikSort(int* num, int low,int high);
//5.选择排序
void selectSort(int* num, int len);
int main()
{
	int num[] = {6,2,1,9,7,4};
	//shellSort(num,6);
	//bubbleSort(num,6);
	//quikSort(num,0,5);
	selectSort(num,6);
	for(int i=0; i<6;i++)
		cout<<num[i]<<" ";
	return 1;
}

/************************************************************************/  
/*直接插入排序 
  将整个数组分为已经排好序的部分,和未排好序的部分,未排好序的部分想已经排好序的部分插入数据 
  整个算法的精妙之处在于,哨兵的设置。 
  1、将要插入的值拿出来,当成哨兵。因为设置了哨兵,因此向后移动过程中,不用担心数值覆盖。 
  2、向排好序的部分插入时,比较过程和移动过程一起进行(这是数组的特点)。与哨兵进行比较。 
  3、在得到目的地址之后,直接插入即可。 
*/  
/************************************************************************/  
void insertSort(int num[],int len)
{
	int temp;//哨兵
	int j;
	for(int i=0; i<len; i++)
	{
		temp = num[i];
		for( j=i; j>=1; j--)
		{
			if(num[j-1] > temp)
			{
				num[j] = num[j-1];
			}
		}
		num[j] = temp;
	}
}

/************************************************************************/  
/* 希尔排序,缩小增量排序。 
   其是在直接插入排序基础之上,利用 
   1、在排序记录基本为正序时期复杂度降为O(n)的情况。 
   2、直接插入排序简单,在n值很小时效率也很高。 
   希尔排序的时间复杂度不好估量,gap的选取也没有定论,gap=[gap/2]的程序较好写。 
*/  
/************************************************************************/
void shellSort(int* num,int len)
{
	int step = len/2;
	int i,j,temp;
	while(step >= 1)
	{
		for(i = step; i< len; i++)
		{
			temp = num[i];
			for(j=i; j-step>=0; j-=step)
			{
				if(temp < num[j-step])
				{
					num[j] = num[j-step];
				}
				else
					break;
			}
			num[j] = temp;
		}
		step/=2;
	}
}

void bubbleSort(int* a,int n)
{
	int i,j;
	int temp;
	for(i = n; i>1;i--)
	{
		for(j =1; j< i; j++) //内层循环的意思是,对没个元素都要与其他未排的元素进行比较  
							//内存排序可以理解为找最大的元素出来。但是找的过程中,  
						 //因为len-i这些元素已经排序过了,因此,没有必要再次比较。  
						 //而len-i-1的原因是,需要进行a[j+1]的比较。 
		{
			if(a[j-1] > a[j])
			{
				temp = a[j-1];
				a[j-1] = a[j];
				a[j] = temp;
			}
		}
	}
}
//快速排序  
/************************************************************************/  
/* 是对冒泡排序的一种改进,通过一趟排序将待排序的记录分成独立的两部分, 
   其中一部分比另一部分记录的关键字小。然后对这两部分分记录进行快速排序。 递归的栈空间为O(logn) 
  */  
/************************************************************************/
int oneQuikSort(int* num,int low,int high)//一趟快速排序
{
	int key = num[low];
	int temp;
	while(low < high)
	{
		while(num[high] > key) high--;
		temp = num[high];
		num[high] = num[low];
		num[low] = temp;
		while(num[low] < key) low++;
		temp = num[low];
		num[low] = num[high];
		num[high] = temp;
	}
	return low;
}
void quikSort(int* num,int low,int high)
{
	if(low < high)
	{
		int mid = oneQuikSort(num,low,high);
		quikSort(num,low,mid-1);
		quikSort(num,mid+1,high);
	}
	
}
//在每趟比较重选择最小的输放在相应的位置
void selectSort(int* num, int len)
{
	for(int i=0; i<len; i++)
	{	
		for(int j=i+1; j<len; j++)
		{
			if(num[j] < num[i])
			{
				int temp = num[j];
				num[j] = num[i];
				num[i] = temp;
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值