zoukankan      html  css  js  c++  java
  • 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中
    
    }
    }
    

      

  • 相关阅读:
    第三方驱动备份与还原
    Greenplum 解决 gpstop -u 指令报错
    yum安装(卸载)本地rpm包的方法(卸载本地安装的greenplum 5.19.rpm)
    Java JUC(java.util.concurrent工具包)
    netty 详解(八)基于 Netty 模拟实现 RPC
    netty 详解(七)netty 自定义协议解决 TCP 粘包和拆包
    netty 详解(六)netty 自定义编码解码器
    netty 详解(五)netty 使用 protobuf 序列化
    netty 详解(四)netty 开发 WebSocket 长连接程序
    netty 详解(三)netty 心跳检测机制案例
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3413002.html
Copyright © 2011-2022 走看看