数据结构之排序

数据结构之排序

排序是计算机程序设计中的一种重要操作,它的功能试讲一个数据元素(或者记录)的任意序列,重新排列成一个按关键字有序的序列。

本次推文将介绍数据结构中的几种排序,主要是属于内部排序。

由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序分为两大类,一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程;另一类是外部排序,指的是待排序的记录数据量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的过程,本次推文将不讲此种排序。

  1. 首先介绍最简单的排序方法:直接插入排序;它的基本操作是将一个记录插入到已排好的有序表中,从而得到一个新的,记录增加1的有序表。基本思路是将第i个元素与前i-1个元素构成的子序列进行比较,利用循环。
  2. 当待排序记录的数量很大时,则可以采用其他插入排序方法,利用折半查找(不同的同学可以自行先百度一下)和插入的结合,在直接插入排序的基础上减少了比较和移动的次数。大致思路还是和直接排序相类似。
  3. 起泡排序:是借助交换进行排序的方法,将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序(num1>num2),则将两记录交换,然后比较第二个记录的关键字和第三个记录的关键字,以此类推。

代码块

void bubble_sort(int data[], int n)  //从小到大排序
{
	for (int i = 0; i <= n - 2; i++)  //总共需要n-1趟
	{
		<br>for (int j = 0; j <= n - i - 2; j++)   
			<br>if (data[j] > data[j + 1])    
				<br>swap(data[j], data[j + 1]);  //大的往后"沉"
}
}

  1. 第四种是对上述起泡排序的改进:快速排序,其思想如下:
    选择一个基数,可以是随机的,但一般情况会以最左边的数作为基数,我们将在下面的例子中为大家演示一遍:
    假设我们有一串数组:6,1,4,7,9,2,5,3,10.设置初始变量,low,high,让low,high分别指向最左边和最右边,即指向6和10;我们选择6作为基数,即要完成比6小的数放在6的左边,比6大的数放在6的右边;low从左到右找比6大的数,high从右到左找比6小的数,当两个变量指向同一位置时,则完成一轮排序;我们来看例子:先让high出发,即high-1,然后low+1;low第一个找到7,high第一个找到3,接下来我们就需要交换7和3的位置,此时,数组为6,1,4,3,9,2,5,7,10,接着继续移动low和high,也必须要让high先出发,然后high指向了5,low指向了9,此时也是交换两个数值,完成第二轮排序,数组为6,1,4,3,5,2,9,7,10,接着继续移动low和high,发现他们同时指向了2,说明第一轮遍历结束,然后交换6和2的位置,即有2,1,4,3,5,6,9,7,10,此时6的左边都比6小,右边都比6大,接下来分别对6的两边进行相同的操作,即完成整个数组的排序;
    *需要着重强调的一点是,每一次移动,都必须从high先开始,这个同学们可以上网看看相关的分析。
    其算法代码:

		void QuickSort(SeqList R,int low,int high)
	   		{ //对R[low..high]快速排序
	     int pivotpos; //划分后的基准记录的位置
	     if(low<high){//仅当区间长度大于1时才须排序
	        pivotpos=Partition(R,low,high); //对R[low..high]做划分
	        QuickSort(R,low,pivotpos-1); //对左区间递归排序
	        QuickSort(R,pivotpos+1,high); //对右区间递归排序
	      }
	    } //QuickSort

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值