C++程序原码
直接插入排序基本算法
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
const int n=100000;
typedef struct{
int key;
}RedType; typedef struct{
RedType *r; //r[n+1];
int length;
}SqList; int random();
void InsertSort(SqList &L);
void main(){ SqList L;
L.r = new RedType[n+1];
L.length=n;
for(int i=1;i<=n;i++) L.r[i].key=random();
long t1,t2;
t1=clock();
InsertSort(L);
t2=clock();
cout<<" 时间: "<<float(t2-t1)/CLK_TCK<<endl; }
int random(){
int A=48271;
int M=2147483646;
int Q=M/A;
int R=M%A;
static int x=1; int x1;
x1=A*(x%Q)-R*(x/Q);
if(x1>=0) x=x1;
else x=x1+M;
return x;
} void InsertSort(SqList &L) //直接插入排序__基本算法:
{ //对顺序表L作直接插入排序。
for(int i=2;i<=L.length;++i)
if((L.r[i].key < L.r[i-1].key)) { //"<",需将L.r[i]插入有序子表
L.r[0]=L.r[i]; //复制为哨兵
L.r[i]=L.r[i-1];
for(int j=i-2;(L.r[0].key<L.r[j].key);--j)
L.r[j+1]=L.r[j]; //记录后移 L.r[j+1]=L.r[0]; //插入到正确位置
}
}//InsertSort */ 改进1 #include<iostream.h>
#include<stdlib.h>
#include<time.h>
const int n=100000;
typedef struct{
int key;
}RedType; typedef struct{
RedType *r; //r[n+1];
int length;
}SqList; int random();
void InsertSort(SqList &L);
void main(){ SqList L;
L.r = new RedType[n+1];
L.length=n;
for(int i=1;i<=n;i++) L.r[i].key=random();
long t1,t2;
t1=clock();
InsertSort(L);
t2=clock();
cout<<" 时间: "<<float(t2-t1)/CLK_TCK<<endl; }
int random(){
int A=48271;
int M=2147483646;
int Q=M/A;
int R=M%A;
static int x=1; int x1;
x1=A*(x%Q)-R*(x/Q);
if(x1>=0) x=x1;
else x=x1+M;
return x;
} void InsertSort(SqList &L) //直接插入排序少
{
int low,high,m;
//对顺序表L作折半插入排序。
for(int i=2;i<=L.length;++i)
{
L.r[0]=L.r[i]; //将L.r[i]暂存到L.r[0]
low=1;high=i-1;
while(low<=high)
{ //在r[low..high]中折半查找有序插入的位置
m=(low+high)/2; //折半
if (L.r[0].key<L.r[m].key) high=m-1; //插入点在低半区
else low=m+1; //插入点在高半区
}//while
for(int j=i-1;j>=high+1;--j)L.r[j+1]=L.r[j]; //记录后移
L.r[high+1]=L.r[0]; //插入
} //for
}//InsertSort 改进2表插入排序 #include<iostream.h>
#include<stdlib.h>
#include<time.h>
const int n=100000;
const int MAXINT=2147483647; typedef struct{
int key; //r[n+1];
int next;
}SLNode;
typedef struct
{
SLNode *r;
int length;
}SLinkList; int random();
void LInsertionSort (SLinkList &SL, int m);
void Arrange(SLinkList &SL);
void main(){ SLinkList L;
L.r = new SLNode[n+1];
L.length=n;
for(int i=1;i<=n;i++)
L.r[i].key=random();
long t1,t2;
t1=clock();
LInsertionSort(L,n);
Arrange(L);
t2=clock();
cout<<" 时间: "<<float(t2-t1)/CLK_TCK<<endl; }
int random(){
int A=48271;
int M=2147483647;
int Q=M/A;
int R=M%A;
static int x=1; int x1;
x1=A*(x%Q)-R*(x/Q);
if(x1>=0) x=x1;
else x=x1+M;
return x;
} void LInsertionSort (SLinkList &SL, int m)
{
// 对记录序列SL[1..n]作表插入排序。
int i,j,k;
SL.r[0].key = MAXINT ;
SL.r[0].next = 1; SL.r[1].next = 0;
for ( i=2; i<=m; ++i )
{
for ( j=0, k = SL.r[0].next; SL.r[k].key <= SL.r[i].key ; j = k, k = SL.r[k].next );
SL.r[j].next = i; SL.r[i].next = k;
} // 结点i插入在结点j和结点k之间
}// LinsertionSort void Arrange(SLinkList &SL){
//根据静态链表SL中各结点的指针值调整记录位置,使得SL中记录按关键字非递减有序顺序排列
int p,q,i;
SLNode temp;
p=SL.r[0].next; //p指示第一个记录的当前位置
for(i=1;i<SL.length;++i){ //SL.r[1..i-1]中记录已按关键字有序排列,第
//个记录在SL中的当前位置应不小于i
while(p<i) p=SL.r[p].next; //找到第i个记录,并用p指示其在SL中的
//当前位置
q=SL.r[p].next; //q指示尚未调整的表尾
if(p!=i){
temp=SL.r[p]; SL.r[p]= SL.r[i]; SL.r[i]=temp; //交换记录,使第i个记录到位
SL.r[i].next=p; //指向被移走的记录,使得以后可由while循环找回
}
p=q; //q指示尚未调整的表尾,为找第i+1个记录作准备
}
} //Arrange 冒泡排序 #include<iostream.h>
#include<stdlib.h>
#include<time.h> const int n=100000; int random();
void bubble(int a[],int l); void main()
{
int *r=(int *)malloc(sizeof(int)*n);
for(int i=0;i<n;i++)
r[i]=random();
long t1,t2;
t1=clock();
bubble(r,n);
t2=clock();
cout<<" 时间: "<<float(t2-t1)/CLK_TCK<<endl;
}
int random()
{
int A=200314;
int M=2003146010;
int Q=M/A;
int R=M%A;
static int x=1;
int x1;
x1=A*(x%Q)-R*(x/Q);
if(x1>=0) x=x1;
else x=x1+M;
return x;
} void bubble(int a[],int l)
{
int i,temp,work;
for(int pass=1;pass<l;pass++) //对数组排序
{work=1;
for(i=0;i<l-pass;i++)
if(a[i]>a[i+1]) //相邻元素比较
{temp=a[i];a[i]=a[i+1];a[i+1]=temp;work=0;}
if(work)break;
}
} 直接选择排序 #include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h> const int n=100000;
typedef struct{
int key; //r[n+1];
int next;
}SLNode;
typedef struct
{
SLNode *r;
int length;
}SLinkList; int random();
void SelectSort(SLinkList &SL ,int m);
void main(){
SLinkList L;
L.r = new SLNode[n+1];
L.length=n;
for(int i=1;i<=n;i++) L.r[i].key=random();
long t1,t2;
t1=clock();
SelectSort(L,n);
t2=clock();
cout<<" 时间: "<<float(t2-t1)/CLK_TCK<<endl; }
int random(){
int A=48271;
int M=2147483646;
int Q=M/A;
int R=M%A;
static int x=1; int x1;
x1=A*(x%Q)-R*(x/Q);
if(x1>=0) x=x1;
else x=x1+M;
return x;
} void SelectSort(SLinkList &SL ,int m){ //直接选择排序
int i,j,k;
for(i=1;i<=m-1;i++){ //n-1趟排序
k=i;
for(j=i+1;j<=m;j++) //在当前无序区中找键值最小的记录R[k]
if ( SL.r[j].key<SL.r[k].key ) k=j;
if (k!=i) { SL.r[0]=SL.r[i];SL.r[i]=SL.r[k];SL.r[k]=SL.r[0]; } //交换R[i]和R[k],R[0]作辅助量
}
} 希尔排序 #include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<stdio.h> const int n=10000000; typedef struct{
int key;
}RedType; typedef struct{
RedType *r; //r[n+1];
int length;
}SqList; int random();
void ShellInsert(SqList &SL,int h);
void ShellSort(SqList &SL,int t);
void main(){
int t;
SqList L;
L.r = new RedType[n+1];
L.length=n;
for(int i=1;i<=n;i++) L.r[i].key=random();
long t1,t2;
t1=clock();
ShellInsert(L,n);
t=log10(double(n+1))/log10(double(2));
ShellSort(L,t);
t2=clock();
cout<<" 时间: "<<float(t2-t1)/CLK_TCK<<endl; }
int random(){
int A=48271;
int M=2147483646;
int Q=M/A;
int R=M%A;
static int x=1; int x1;
x1=A*(x%Q)-R*(x/Q);
if(x1>=0) x=x1;
else x=x1+M;
return x;
} void ShellInsert(SqList &SL,int h){ //对顺序表L作一趟希尔排序.本算法是和一趟直接插入排序相比,作了以下修改:
//1.前后记录位置的增量是h,而不是1;
//2.r[0]只是暂存单元,不是哨兵.当j<=0时,插入位置已找到.
int i,j;
for(i=h+1;i<=SL.length;i++) //i为组号
if(SL.r[i].key>=SL.r[i-h].key) { //R[j]大于有序区最后一个记录,则不需要插入
SL.r[0]=SL.r[i]; //R[0]保存待插记录,但不是监视哨
for(j=i-h;j>0&&(SL.r[0].key>=SL.r[j].key);j-=h )
SL.r[j+h]=SL.r[j];
SL.r[j+h]=SL.r[0];
}
} void ShellSort(SqList &SL,int t){ //d[]为增量序列,t为增量序列长度
int i,dlta;
for(i=0;i<t;i++)
{ //各趟插入排序
dlta=pow(2,t-i+1)-1;
ShellInsert(SL,dlta);
if(dlta==1)
break;
}
} 快速排序 #include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<stdio.h> const int n=1000000; typedef struct{
int key;
}RedType; typedef struct{
RedType *r; //r[n+1];
int length;
}SqList; int random();
int partition(SqList &L,int low,int high);
void QSort(SqList &L,int low,int high);
void main(){ int t,m;
SqList L;
L.r = new RedType[n+1];
L.length=n;
for(int i=1;i<=n;i++) L.r[i].key=random();
long t1,t2;
t=1;
m=n;
t1=clock();
QSort(L,t,m);
t2=clock();
cout<<" 时间: "<<float(t2-t1)/CLK_TCK<<endl;
// for(i=1;i<=n;i++)
// cout<<L.r[i].key<<endl; }
int random(){
int A=48271;
int M=2147483647;
int Q=M/A;
int R=M%A;
static int x=1; int x1;
x1=A*(x%Q)-R*(x/Q);
if(x1>=0) x=x1;
else x=x1+M;
return x;
} int partition(SqList &L,int low,int high){
int pivotkey;
//交换顺序表L中子表r[low..high]的记录,枢轴记录到位,并返回其所在位置,此时在它之前(后)的//记录均不大(小)于它.
L.r[0]=L.r[low]; //用子表的第一个记录作枢轴记录
pivotkey=L.r[low].key; //枢轴记录关键字
while(low<high){ //从表的两端交替的向中间扫描
while(low<high&&L.r[high].key>=pivotkey) --high;
L.r[low]=L.r[high]; //将枢轴记录小的记录移到低端
while(low<high&&L.r[low].key<=pivotkey) ++low;
L.r[high]=L.r[low]; //将枢轴记录大的记录移到高端
}
L.r[low]=L.r[0]; //枢轴记录到位
return low; //返回枢轴位置
}// partition void QSort(SqList &L,int low,int high){
int pivotloc;
//对顺序表L中的子序列L.r[low..high]做快速排序
if (low<high){ //长度大于1
pivotloc=partition(L,low,high); //将L.r[low..high]一分为二
QSort(L,low,pivotloc-1); //对低子表递归排序,pivotloc是枢轴位置
QSort(L,pivotloc+1,high); //对高子表递归排序
}
}//QSort 堆排序 #include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<stdio.h> const int n=10000; typedef struct{
int key;
}RedType; typedef struct{
RedType *r; //r[n+1];
int length;
}SqList; int random();
void HeapSort(SqList &R,int m);
void main(){ int t,m;
SqList L;
L.r = new RedType[n+1];
L.length=n;
for(int i=1;i<=n;i++) L.r[i].key=random();
long t1,t2;
t=1;
m=n;
t1=clock();
HeapSort(L,n);
t2=clock();
cout<<" 时间: "<<float(t2-t1)/CLK_TCK<<endl;
// for(i=1;i<=n;i++)
// cout<<L.r[i].key<<endl; }
int random(){
int A=48271;
int M=2147483647;
int Q=M/A;
int R=M%A;
static int x=1; int x1;
x1=A*(x%Q)-R*(x/Q);
if(x1>=0) x=x1;
else x=x1+M;
return x;
} void Sift(SqList &R,int p,int q)
{
int j;
R.r[0]=R.r[p];
j=2*p;
while(j<=q)
{
if(j<q&&R.r[j].key<R.r[j+1].key)j++;
if(R.r[0].key>R.r[j].key)break;
R.r[p]=R.r[j];
p=j;
j=2*p;
}
R.r[p]=R.r[0];
} void HeapSort(SqList &R,int m){ //对R[1]到R[n]进行堆排序
int i;
for(i=m/2;i>=1;i--) Sift(R,i,m); //建初始堆
for(i=m;i>=2;i--){ //进行n-1趟堆排序
R.r[0]=R.r[1]; //堆顶和当前堆底交换,R[0]作辅助量
R.r[1]=R.r[i];
R.r[i]=R.r[0];
Sift(R,1,i-1); //R[1]到R[i-1]重建成新堆
}
}// HeapSort 二路归并排序 #include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<stdio.h> const int n=1000000; typedef struct{
int key;
}RedType; typedef struct{
RedType *r; //r[n+1];
int length;
}SqList; int random();
void Merge(SqList &R,SqList &R1,int low, int mid,int high);
void MergePass(SqList &R,SqList &R1,int m,int len);
void MergeSort(SqList &R,SqList &R1,int m);
void main(){
// int m;
//m=log10(double(n+1))/log10(double(2));
SqList L;
SqList L1;
L.r = new RedType[n+1];
L1.r=new RedType[n+1];
L.length=n;
for(int i=1;i<=n;i++) L.r[i].key=random();
long t1,t2;
t1=clock();
MergeSort(L,L1,n);
t2=clock();
cout<<" 时间: "<<float(t2-t1)/CLK_TCK<<endl;
// for(i=1;i<=n;i++)
// cout<<L.r[i].key<<endl; }
int random(){
int A=48271;
int M=2147483647;
int Q=M/A;
int R=M%A;
static int x=1; int x1;
x1=A*(x%Q)-R*(x/Q);
if(x1>=0) x=x1;
else x=x1+M;
return x;
} void Merge(SqList &R,SqList &R1,int low, int mid,int high)
{
int i,j,k;
i=low;j=mid+1;k=low;
while(i<=mid&&j<=high)
if(R.r[i].key<=R.r[j].key)
R1.r[k++]=R.r[i++];
else R1.r[k++]=R.r[j++];
while(i<=mid) R1.r[k++]=R.r[i++];
while(j<=high) R1.r[k++]=R.r[j++];
} void MergePass(SqList &R,SqList &R1,int m,int len){ //对R做一趟归并,结果在R1中
int i,j;
i=1; //i指第一对子表的起始点
while(i+2*len-1<=m){ //归并长度为len的两个子表
Merge(R,R1,i,i+len-1,i+2*len-1);
i=i+2*len; //指向下一对子表起始点
}
if(i+len-1<m) //剩下两个子表,其中一个长度小于len
Merge(R,R1,i,i+len-1,m);
else //子表个数为奇数,剩一段
for(j=i;j<=m;j++) //将最后一个表复制到R1中
R1.r[j]=R.r[j];
} void MergeSort(SqList &R,SqList &R1,int h) { //对R二路归并排序,结果在R中(非递归算法)
int len;
len=1;
while(len<h){
MergePass(R,R1,h,len);len=len*2; //一趟归并,结果在R1中
MergePass(R1,R,h,len);len=len*2; //再次归并,结果在R中 }
}
C++程序原码的更多相关文章
- 复用微信小程序源码包后仍然有原小程序的版本管理怎么处理
前言: 复用微信小程序源码包后,重新创建项目导入源码包,会发现开发者工具版本管理中仍然有原来小程序的版本,这样就不太好了.毕竟是一个新的小程序,需要有新的版本控制的.那么这个问题怎么处理呢? 解决方案 ...
- C语言基础(4)-原码,反码,补码及sizeof关键字
1. 原码 +7的原码是0000 0111 -7的原码是1000 0111 +0的原码是0000 0000 -0的原码是1000 0000 2. 反码 一个数如果值为正,那么反码和原码相同. 一个数如 ...
- JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
- Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
- 原码、反码、补码的正(nao)确(can)打开方式
我们知道日常生活中使用的数分为整数和实数,整数的小数点固定在数的最右边,可以省略不写,而实数的小数点则不固定.在计算机中只能识别和表示“0”和“1”,而无法识别小数点,因此要想使得计算机能够处理日常使 ...
- python之计算机硬件基本认知_数据单位_进制间转换_数的原码反码补码
一:计算机硬件基本认知 cpu: 中央处理器. 相当于人的大脑.运算中心,控制中心. 内存: 临时存储数据. 优点:读取速度快,缺点:容量小,造价高,断电即消失. 硬盘: 长期存储数据. ...
- 原码、补码,反码以及JAVA中数值采用哪种码表示
原码.补码,反码以及JAVA中数值采用哪种码表示 1.原码定义(摘自百度百科):一种计算机中对数字的二进制定点表示方法,原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位 ...
- 原码、反码、补码及位操作符,C语言位操作
计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单 ...
- Java学习--反码 原码 补码简析
关于课上实验中对小数的处理中出现的问题涉及到原码,反码,补码的问题,所以在网上进行了一下搜索.在原码,反码,补码中的解释可得知,无论是哪一种码,能够表示的数的范围是-2^(位数-1)+1至2^(位数- ...
随机推荐
- 【转】iOS开发6:UIActionSheet与UIAlertView
原文: http://my.oschina.net/plumsoft/blog/42763 iOS程序中的Action Sheet就像Windows中的 “确定-取消”对话框一样,用于强制用户进行选择 ...
- UILabel的高度自适应
_content = [UILabel new]; _content.text = @"日落时分,沏上一杯山茶,听一曲意境空远的<禅>,心神随此天籁,沉溺于玄妙的幻境里.仿佛我就 ...
- jQuery 停止动画
jQuery stop() 方法用于在动画或效果完成前对它们进行停止. 停止滑动 点击这里,向上/向下滑动面板 实例 jQuery stop() 滑动演示 jQuery stop() 方法. jQue ...
- javascript基础学习(四)
javascript之流程控制语句 学习要点: 表达式语句含义 选择语句:if.if...else.switch 循环语句:while.do...while.for.for...in 跳转语句:bre ...
- (java)从零开始之--异常处理(以文件拷贝为例)
开发过程中避免不了对异常的处理,但是异常的处理又不能乱throw 下面是简单的抛异常处理 public static void CopyFile(String souFile,String dirFi ...
- Sqoop import加载HBase过程中,遇到Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x
在执行hbase sqoop抽取的时候,遇到了一个错误,如下图: 在执行程序的过程中,遇到权限问题很正常,也容易让人防不胜防,有问题就想办法解决,这个是关键. 解决办法如下: 第一步:su hdfs, ...
- in_array 判断问题的疑惑解决。
面试题中有一条是关于in_array判断的,题目如下: 如何大家没有深入了解in_array的类型判断过程,而是根据经验来选择,肯定很多人也是是选择了D答案的,具体的原因我也是从牛人的博客里面得到答案 ...
- PHPCMS 使用图示和PHPCMS二次开发教程(转)
PHPCMS V9 核心文件说明 模块与控制器 模块: phpcms v9框架中的模块,位于phpcms/modules目录中 每一个目录称之为一个模块.即url访问中的m. 访问content模块示 ...
- phpcms 标签解析
phpcms 每个pc标签对应modules控制器下一个 tag.class类 比如 {pc:content action="position" posid="2&quo ...
- RemoteViews嵌入ListView复杂布局
from http://blog.csdn.net/liliang497/article/details/8308313 主要函数 public void setRemoteAdapter (int ...