编程珠玑---读书笔记---第11章排序

插入排序:

对于小型的排序任务速度很快,它是稳定的,只需要O(1)的额外空间,基于比较和交换的次数为O(n^2)。

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <queue>
using namespace std;
int x[8]={55,41,59,26,53,58,97,93};
int main()
{
	//ifstream fin;
	//fin.open("data1.txt");
	for(int i=1;i<8;i++)
		for(int j=i;j>0 && x[j]<x[j-1];j-- )
		{
			int t=x[j];
			x[j]=x[j-1];
			x[j-1]=t;
		}
	for(int i=0;i<8;i++)cout<<x[i]<<" ";
	cout<<endl;
	
	return 0;

}

 


快速排序:

如果n很大,快速排序的O(n*logn)的运行时间就很关键了,在结合随机划分和双向划分后,对于任意的n元输入数组,快排的期望运行时间正比于 n logn。

下面代码的版本是基于第一个元素进行划分,对于随机输入的数据这是没有问题的,但是对于某些常见输入,比如数组已基本有序,那么最坏情况下需要

O(n^2)的时间,这时候,我们可以才用随机划分元素的方法,可以改善性能,通过把第一个元素和后面所有元素中的一个随机项交换来实现这一点:

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <queue>
using namespace std;
int x[8]={55,41,59,26,53,58,97,93};
void qsort1(int l,int u)
{
	if(l>=u)return;
	int m=l;
	for(int i=l+1;i<=u;i++)
	{
		if(x[i]<x[l]){
			m++;
			int t=x[m];
			x[m]=x[i];
			x[i]=t;
		}
	}
	int t=x[l];
	x[l]=x[m];
	x[m]=t;
	qsort1(l,m-1);
	qsort1(m+1,u);
	
}
int main()
{
	qsort1(0,7);
	
	for(int i=0;i<8;i++)cout<<x[i]<<" ";
	cout<<endl;
	
	return 0;

}

 


顺便说一下:C库函数qsort非常简单相对较快,但是它比我们自己写的快排慢,仅仅是因为其通用而灵活的接口对每次比较都使用函数调用,C++库函数sort具有最简单的

接口:我们通过调用sort(x,x+n)来对数组x排序,实现也很高效。

原文地址:https://www.cnblogs.com/dyllove98/p/3153162.html