插入排序和快速排序的优化——编程珠玑
来源:互联网 发布:三级便民服务网络体系 编辑:程序博客网 时间:2024/06/03 09:21
插入排序和快速排序的优化——编程珠玑
1.插入排序
方法一:
#include <algorithm>
- for(int i=1;i<5;i++)
- t j=i;j>0&&a[j-1]>a[j];j--)
- swap(a[j-1],a[j]);
- int temp;
- for(int i=1;i<5;i++)
- for(int j=i; j>0 && a[j-1]>a[j]; j--)
- {
- temp=a[j];
- a[j]=a[j-1];
- a[j-1]=temp;
- }
- for(i=1;i<5;i++)
- {
- t=a[i];
- for(j=i; j>0 && a[j-1]>t; j--)
- a[j]=a[j-1];
- a[j]=t;
- }
2.快速排序
方法一:O(nlog(n)时间和O(logn)的栈空间
- #include"stdio.h"
- void Partition(int a[],int left,int right)
- {
- int i=left,j=right;
- int temp=a[i];//记录下轴的位置
- if(left>=right)//退出条件
- return;
- while(i<j)
- {
- while(i<j&&temp<=a[j])//从右侧查找,找到第一个比轴小的
- j--;
- a[i]=a[j];//小的 等于后面的大的 (之后的i 会增加)【后面的大的 移动到前面来后 本趟不会再动】
- while(i<j&&temp>=a[i])//从左侧查找,找到第一个比轴大的
- i++;
- a[j]=a[i]; // 大的后移
- }
- a[i]=temp;//找到轴的正确位置
- Partition(a,left,j-1);
- Partition(a,j+1,right);
- }
- int main()
- {
- int a[10]={3,4,2,1,6,5,7,8};
- Partition(a,0,7);
- for(int i=0;i<8;i++)
- printf("%d\n",a[i]);
- return 0;
- }
方法二::双向划分避免所有元素都相等时候的最坏情况
- #include <iostream>
- #include <algorithm>
- using namespace std;
- void quictSort(int a[],int l,int u)
- {
- if(l >= u)
- return;
- int t = a[l];//记录轴
- int i = l;
- int j = u+1;
- for(;;)
- {
- do i++;while(i <= u && a[i] < t);//先i++再判断条件
- do j--;while(a[j] > t); //先j--再判断条件
- if(i > j) //无限循环退出的条件
- break;
- swap(a[i],a[j]);//每找到一个前面元素大于等于轴,跟后面小于等于轴的就交换
- }
- swap(a[l],a[j]);
- quictSort(a,l,j-1);
- quictSort(a,j+1,u);
- }
- int main()
- {
- int a[10]={3,4,2,1,6,5,7,8};
- quictSort(a,0,7);
- for(int i=0;i<8;i++)
- printf("%d\n",a[i]);
- return 0;
- }
利用随机位置的数做轴,会使数组的快速排序得到优化。
- #include <iostream>
- #include <algorithm>
- using namespace std;
- void quictSort(int a[],int l,int u)
- {
- if(l >= u)
- return;
- swap(a[l],a[rand()%(u-l) + l]);//仅仅是在这里做文章
- int t = a[l];
- int i = l;
- int j = u+1;
- for(;;)
- {
- do i++;while(i <= u && a[i] < t);
- do j--;while(a[j] > t);
- if(i > j)
- break;
- swap(a[i],a[j]);
- }
- swap(a[l],a[j]);
- quictSort(a,l,j-1);
- quictSort(a,j+1,u);
- }
- int main()
- {
- int a[10]={3,4,2,1,6,5,7,8};
- quictSort(a,0,7);
- for(int i=0;i<8;i++)
- printf("%d\n",a[i]);
- return 0;
- }
参考文献:
1.《编程珠玑》
2.http://blog.csdn.net/tianshuai11/article/details/7577624
- 插入排序和快速排序的优化——编程珠玑
- 【编程珠玑】第十一章 排序 (插入排序和快速排序的深度优化)
- 编程珠玑——快速排序总结
- 快速排序优化算法 - 编程珠玑
- 插入排序--《编程珠玑》
- 编程珠玑11章——快速排序的改进
- 三个版本的插入排序 - 编程珠玑
- 编程珠玑----快速排序的变形
- [编程珠玑读书笔记] 插入排序
- [编程珠玑读书笔记]快速排序
- 编程珠玑之快速排序
- 编程珠玑:插入排序的最优探索,以及快排
- 几种常见的排序算法(插入排序,希尔排序,归并排序和快速排序)——希尔排序
- 《编程珠玑2》读书笔记-插入排序
- 数组的插入排序和快速排序
- 编程珠玑——排序算法
- 位图排序——编程珠玑
- 位图排序——《编程珠玑》笔记
- WEB项目中出现The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in ei问题的解决方法
- MAC下Android的Eclipse开发环境的搭建
- 图片
- svn常用目录结构
- 产品经理需要意识到的事
- 插入排序和快速排序的优化——编程珠玑
- css中!important的作用
- Android实现数据存储技术
- apache rewrite 参数和例子
- c++可变参数列表---float问题
- 函数与过程的区别
- A simple libpng example program
- Django ajax
- android获取当前程序版本名