排序【应用篇】

排序

一、插入排序

1、插入排序的算法

void straightsort(seqlist r ,int n)
{
	for(i=2;i<=n;i++)						//从第2个位置开始,把2~n的对象插入
	{
		r[0] = r[i]; 						//复制r[i]到r[0]为哨兵
		j=i-1;
		while(r[0].key<r[j].key) 			//待插入位置记录从后向前依次后移
		{
			r[j+1]=r[j];
			j--;
		}
		r[j+1]=r[0];						//插入到正确位置
	}
}

2、考点归纳

  1)折半插入排序和直接插入排序异同点

    不同点:折半插入排序元素比较次数少于直接插入排序

    相同点:折半插入排序的平均移动元素次数与直接插入排序一致

    注意:一个算法的时间复杂度,与所需要比较的关键字次数、需要移动的记录数量都有关,

  2)直接插入排序

    直接插入排序元素的移动和比较次数在最坏情况下可以达到n(n-1)/2,元素比较次数最少可以达到 n-1 次。

3、插入类排序

  插入排序的原理:向有序序列中依次插入无序序列中待排序的记录,直到无序序 列为空,对应的有序序列即为排序的结果,其主旨是“插入”。已经参加排序的元素已经组成一个有序序列。

二、冒泡排序

1、冒泡排序的算法 

void bubble(int r[n])
{
	for(i=0;i<=n-2; i++)
	{
		exchange=0; //标志位,
		for(j=n-2; j>=i ;j--)
		if (r[j+1]>r[j])
		{
			temp=r[j+1];
			r[j+1]=r[j];
			r[j]=temp;
			exchange=1;
		}
		if (exchange==0) return; //某一轮排序没有发生交换,说明已经有序
	}
}

2、交换类排序  

  交换排序的原理:先比较大小,如果逆序就进行交换,直到有序。其主旨是“若逆 序就交换”。一趟中可以在无序序列中找到最小或者最大的值

三、简单选择排序

1、简单选择排序算法

void SelectSort(RecordType R[ ] , int length)
{
	n=length;
	for ( i=1 ; i<= n-1 ; i++)          //共进行 n-1 趟排序
	{
		k=i ;                  //记录下最小元素位置
		for ( j=i+1; j<=n ; j++ )      //在 R[i,…,n]中选择关键字最小的记录
			if ( R[j].key < R[k].key )
				k=j;
			if (k!=i)           //与第 i 个记录交换
			{
				x=R[i] ;
				R[i]=R[k] ;
				R[k]=x;
			}
	}
}

采用单链表实现

selectsort(struct node *head)
{
	p=head;
	while(p!=NULL)
	{
		q=p;
		r=p->next;
		while(r!=NULL)
		{
			if(r->data < q->data) q=r;
			r-r->next;
		}
	tmp = q->data;
	q->data = p->data;
	p->data = tmp;
	p = p->next;

}

2、考点归纳

  简单选择排序所需的比较次数为n(n-1)/2.

  简单选择排序移动次数最坏情况下可以达到3(n-1),最好情况下移动次数达到0.

3、选择类排序

  选择排序的原理:从无序序列找关键字最小的记录,再放到已排好序的序列后面, 直到所有关键字全部有序,其主旨是“选择”。

四、希尔排序

1、对记录的关键字为{50 , 26 , 38 , 80 , 70 , 90 , 8 , 30 , 40 , 20 }进行排序,求出其排序过程

2、插入类排序

  插入排序的原理:向有序序列中依次插入无序序列中待排序的记录,直到无序序 列为空,对应的有序序列即为排序的结果,其主旨是“插入”。已经参加排序的元素已经组成一个有序序列。

五、快速排序

1、快速排序的算法

void qksort(int a[], int L, int H)
{
	int i, j, x;
	if(L > H)
	return ;					//输入不合法
	i = L;
	j = H;
	x = a[i];					//将当前表中的第一个元素作为轴元素,对表进行划分
	while(i<j)
	{
		while((i < j)&&(a[j]>=x))//j从表的高端左移,一直到第一个比轴元素小得元素才停下来
		j--;
		if(i<j)
		{						//如果该位置不是i的位置,则将该元素移到i位置
			a[i]=a[j];
			i++;
		}
		while((i < j)&&(a[i]<=x))//i从表的低端右移,一直到第一个比轴元素大得元素才停下来
		i++;
		if(i<j)
		{						//如果该位置不是j的位置,则将该元素移到j位置
			a[j]=a[i];
			j--;
		}
	}
	a[i]=x;					//i=j时把轴元素放上去
	qksort(a,L,j-1);
	qksort(a,j+1,H);
} 

2、考点归纳

  快速排序在要排序的数据已基本有序的情况下,不利于其长处

3、有一组键值 27,84,21,47,15,25,68,35,24,采用快速排序方法由小到大进行 排序,请写出每趟的结果。

  第一趟

  第二趟

  第三趟

六、堆排序

1、堆排序的特点

  大顶堆满足只要一个结点存在左右孩子结点,则必须满足该结点大于左孩 子结点且大于右孩子结点。小顶堆满足只要一个结点存在左右孩子结点,则必须满足该结 点小于左孩子结点且小于右孩子结点。

2、将关键字 5、 56、 20、 23、 40、 38、 29、 61、 35、 76、 28、 98序列进行堆排序(大根堆),画出堆排序过程。

  1)构建初始的大顶堆

  

  2)堆排序过程

  

七、二路归并排序

  1、设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36, 70,求用归并排序过程

  

八、基数排序

  1、对 278、109、063、930、589、184、505、269、008、083 进行基数排 序,并给出详细的排序过程

  第一趟

  

  结果:

  

  第二趟

  

  结果:

  

  第三趟

  

  结果:

  

时间: 2024-10-11 01:06:33

排序【应用篇】的相关文章

算法(二)初等排序前篇[插入和冒泡排序]

相关文章 算法(一)时间复杂度 前言 排序是算法的基础,排序有很多种方法,有些方法实现起来很简单,但是效率较差,我们可以将这些排序的方法称之为初等排序.这篇文章我们就来学习初等排序中的插入排序和冒泡排序. 1.插入排序 插入排序比较容易想到,思路与打扑克时排列牌的顺序是类似的.比如我们左手拿牌,然后用右手将牌从左到右,从小到大来排序,这就需要我们把需要进行排列的牌抽出来放到合适的位置,并且不断的重复,直到牌的顺序排好,这个过程就可以理解为插入排序. 图解插入排序 插入排序过程中会将需要排序的数组

算法系列【希尔排序】篇

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 关于时间复杂度: 1.     平方阶 (O(n2)) 排序各类简单排序:直接插入.直接选择和冒泡排序. 2.     线性对数阶 (O(nlog2n)) 排序快速排序.堆排序和归并排序: 3.     O(n1+§))排序,§ 是介于 0 和 1 之间的常数.希尔排序 4.     线性阶 (O(n)) 排序基数排序,此外还有桶.箱排序. 关于稳定性: 稳定的排序算法:冒泡排序

排序算法篇--之直接插入排序

直接插入排序是将一个记录插入到已经排好序的有序表中,从而得到一个新的记录数加1的有序表. 下面的代码中会先假设数组的第一个元素是已经拍好序的有序表,然后从第二个元素开始遍历剩下的元素. 所以呢,第一个for循环是遍历待插入的元素,第二个for循环是遍历被插入的有序表,并将待插入元素与有序表的元素比较,将待插入元素插在合适位置. 1 <?php 2 $arr = array(9,8,7,6,5,0,3,2,1,4); 3 4 /** 5 * 返回通过插入排序算法重新排序后的数组 6 * @para

排序算法篇--之简单选择排序

简单选择排序,就是执行n-i次比较,然后从n-i+1个数据中选择最小的值,如果最小值不是第i(1=<i<=n)个,则和第i个交换. 1 <?php 2 $arr = array(9,5,4,8,7,6,0,3,2,1); 3 4 /** 5 * 返回经过简单选择排序算法排序后的数组 6 * @param $array array 要进行排序的数组 7 * return array 进过排序后的数组 8 */ 9 function SelectSort($array){ 10 11 for

白话经典算法系列 - 七大排序总结篇

原文链接: http://blog.csdn.net/MoreWindows/article/category/859207 1.冒泡排序 核心思路: 双重循环 外层是进行多少轮,一轮冒泡只能排好一个数,所以有n轮:(这是最好的理解方式) 内层是单次冒泡,冒泡的核心是逐个,相邻元素两两比较,如此,一轮冒泡后,最大(最小)元素就跑到最后面了 //核心代码 void sort(int *a, int len) { for (int i = 0; i < len; i++) for (int j =

【整理】常见排序算法及其时间复杂度总结

原文出处: 1. 白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇 2. 面试常用算法总结--排序算法(java版) 3. 常见排序算法小结 本篇主要整理了冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序,堆排序七种常见算法,是从上面三篇博文中摘抄整理的,非原创. 一.冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就"沉"到最后面了.重复N次即可以使数组有序. 冒泡排序改进1: 在某次遍历中,如果没有

14. 蛤蟆的数据结构进阶十四排序实现之简单选择排序

14. 蛤蟆的数据结构进阶十四排序实现之简单选择排序 本篇名言:"即是我们是一支蜡烛也应该 " 蜡烛成灰泪始干 " 即使我们只是一根火柴也要在关键时刻有一次闪耀即使我们死后尸骨都腐烂了解也要变成磷火在荒野中燃烧. -- 艾青" 继续来看什么是简单选择排序. 欢迎转载,转载请标明出处: 1.  简单选择排序 设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出排序码最小的记录,与第i个记录交换.执行n-1趟后就完

47. 蛤蟆的数据结构笔记之四十七的有向无环图的应用排序

47.蛤蟆的数据结构笔记之四十七的有向无环图的应用排序 本篇名言:"君子喻于义 ,小人喻于利. -- 孔丘" 接下去来看下有向无环图. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47110397 1.  有向无环图 一个无环的有向图称做有向无环图(directedacycline praph).简称DAG图.DAG 图是一类较有向树更一般的特殊有向图,图1给出了有向树.DAG图和有向图 有向无环图是描述含有公共

【学习】大文件统计与排序(转载)

学习:大文件统计与排序 这篇主要记录一下学习陈硕同学的对下面这道题的算法思想与代码. 题目是这样的: 有10个文件,每个文件1G,每个文件的每行存放的都是用户的query(请自己随机产生),每个文件的query都可能重复.要求你按照query的频度排序. (当然,这里的重点是大文件,所以10个1G的文件,或者1个10G的文件,原理都是一样的) 陈硕的代码在这里: https://gist.github.com/4009225 这是一段非常漂亮的代码,解法与代码都非常值得一看. [解法] 基本步骤

LeetCode总结 -- 一维数据合并篇

合并是一维数据结构中很常见的操作, 通常是排序, 分布式算法中的子操作. 这篇总结主要介绍LeetCode中关于合并的几个题目: Merge Two Sorted ListsMerge Sorted ArraySort ListMerge k Sorted Lists 我们先来看看两个有序一维数据的合并, 这里主要是要介绍链表的合并操作, 不过因为一维数组的合并也比较简单, 而且与链表有比较性, 就顺便在这里列举一下. Merge Two Sorted Lists就是要求合并两个有序链表, 一般