博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程珠玑第十一章----排序
阅读量:5239 次
发布时间:2019-06-14

本文共 2174 字,大约阅读时间需要 7 分钟。

1、快速排序

     原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。

void quickSort(int *a,int s,int t)   //数组首地址a,数组起始位置s(初始值为0),结束位置t(初始值为n-1){	int i=s,j=t+1,temp,x=a[s];	do	{		do 		{			i++;		} while (a[i]

2、堆排序

     原理:首先建立最大根堆,将根元素和根堆中最后一个元素调换,这样最后一个元素就排好序了,然后将剩余的元素更新为最大根堆,按照前面的方法,直至根堆中只剩下最后一个元素,排序完成。

void initHeap(int *data,int n)                //初始化根堆{	int t;	for (int i=(n-1)/2;i>=0;i--)	{		if (2*i+2<=n&&data[2*i+1]

3、归并排序

     原理:递归将待排序数组分割成n个部分,每部分只有1个元素,然后在递归将每2个部分元素进行排序,直至最后只剩下一个完整的部分,排序完成。

template
void Merge(T a[],T TR[],int low,int mid,int high) //归并排序 a[low]~a[mid] 、a[mid]~a[high] { int i = low; int j = mid + 1; int k = 0; while(i <= mid && j <= high) { if(a[i] < a[j]) TR[k++] = a[i++]; else TR[k++] = a[j++]; } while(i <= mid) TR[k++] = a[i++]; while(j <= high) TR[k++] = a[j++]; for(i = low; i <= high; i++) //将排序好的数据移回到原序列中 a[i] = TR[i - low];}template
void MSort(T a[],T temp[],int low,int high){ if (low

堆排序和快速排序都是不稳定的,而归并排序则是稳定的。

4、两个排好序的链表归并

pList mergeList(pList first,pList second){	pList out,p1,p2,pLast;   //out为返回链表,p1指向first,p2指向second,pLast串联起两个链表		//first链表为空	if(first->next==NULL)             		out=second;		//second链表为空	else if (second->next==NULL)		out=first;		//first和second都不为空	else	{		p1=first->next;		p2=second->next;				//first链表为返回链表		if (p1->data<=p2->data)		{			out=first;			pLast=p1;               //pLast作用为串联这两个链表,指向返回链表的第一个节点			p1=p1->next;		} 				//second链表为返回链表		else		{			out=second;			pLast=p2;			p2=p2->next;		}				while(p1!=NULL&&p2!=NULL)		{			if (p1->data<=p2->data)			{				pLast->next=p1;  //pLast指向带返回的剩余节点				pLast=p1;				p1=p1->next;			}			else			{				pLast->next=p2;				pLast=p2;				p2=p2->next;			}		}				if (p1!=NULL)			pLast->next=p1;		if(p2!=NULL)			pLast->next=p2;	}		return out;}

 5、计数排序

      计数排序算法针对待排序数组中的每个记录,扫描待排序的数组一趟,统计待排序数组中有多少个记录的值比该记录的值小。假设针对某一个记录,统计出的计数值为c,那么,这个记录在新的有序数组中的合适的存放位置即为c。

     计数排序一般适用于输入数据是由一个小范围的数据构成,而且是利用空间换取了时间

//计数排序,输入数组src,输出数组dest,数组长度n,数组中最大元素kvoid CountSort(const int *src,int *dest,int n,int k){	//c为计数数组,首先进行初始化	int *c=new int[k+1];	for(int i=0;i

 

转载于:https://www.cnblogs.com/javaspring/archive/2012/07/27/2656097.html

你可能感兴趣的文章
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>
name phone email正则表达式
查看>>
721. Accounts Merge
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>
redis哨兵集群、docker入门
查看>>
hihoCoder 1233 : Boxes(盒子)
查看>>
oracle中anyData数据类型的使用实例
查看>>
C++对vector里面的元素排序及取任意重叠区间
查看>>
软件测试——性能测试总结
查看>>
12.4站立会议
查看>>
Java Concurrentmodificationexception异常原因和解决方法
查看>>
客户端访问浏览器的流程
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
[BZOJ 5323][Jxoi2018]游戏
查看>>
编程面试的10大算法概念汇总
查看>>