几大排序算法C++实现

public class SortMethod {
 
 //直接插入排序
 public void InsertSort(int[] L){
  for(int i=1;i<L.length;i++)
   if(L[i]<L[i-1]){
    int t = L[i], j;   //t用来临时存放当前所指数
    L[i]=L[i-1];
    for(j=i-2;(j>=0)&&(t<L[j]);j--)
     L[j+1]=L[j];
    L[j+1]=t;
   }
 }
 
 //折半插入排序
 public void BInsertSort(int[] L){
  for(int i=1;i<L.length;i++)
   if(L[i]<L[i-1]){
    
    int t=L[i];
    int low = 0,high=i-1, j;
    
    while(low<=high){
     int mid = (low+high)/2;
     if(t<L[mid]) high = mid -1;
     else low = mid+1;
    }//while循环用来找插入点
    
    for(j=i-1;j>high;j--)
     L[j+1]=L[j];
    L[j+1]=t;
   }//for
 }
 
 //Shell排序
 public void ShellSort(int[] L){
  int dk = L.length/2;
  while(dk>0){
   for(int i=dk;i<L.length;i++)
    if(L[i]<L[i-dk]){
     int t=L[i], j;
     for(j=i-dk;j>=0&&t<L[j];j-=dk)
      L[j+dk]=L[j];
     L[j+dk]=t;
    }
   dk/=2;
  }//while  
 }
 
 //冒泡排序
 public void BubbleSort(int[] L){
  for(int i=0;i<L.length-1;i++)
   for(int j=0;j<L.length-i-1;j++)
    if(L[j]>L[j+1])
    {
     int t=L[j];
     L[j]=L[j+1];
     L[j+1]=t;
    }
 }
 
 //快速排序 
 public void QuickSort(int[] L,int low,int high){
  if(low<high){
   int pivotkey = L[low];
   int i=low,j=high;
   while(i<j){
    while(i<j&&L[j]>=pivotkey) j--;
    if(i<j)
     L[i++]=L[j];
    while(i<j&&L[i]<=pivotkey) i++;
    if(i<j)
     L[j--]=L[i];
   }//while
   L[i]=pivotkey;
   QuickSort(L,low,j-1);
   QuickSort(L,i+1,high);
  }//if
 }
 
 //选择排序
 public void SelectSort(int[] L){
  for(int i=0;i<L.length;i++){
   int minloc=i;
   for(int j=i;j<L.length;j++){
    if(L[minloc]>L[j])
     minloc=j;
   }
   if(i!=minloc){
    int tmp;
    tmp=L[minloc];
    L[minloc]=L[i];
    L[i]=tmp;
   }
  }
 }
 
 //堆排序
 public void HeapAdjust(int[] L,int s,int m){
  int t,j;
  t=L[s];       //备份元素L[s],为其找到适当位置后再插入
  for(j=2*s+1;j<=m;j=j*2+1){  //沿值较大的孩子结点向下筛选
   if(j<m&&L[j]<L[j+1]) j++; //j是值较大的元素的下标
   if(t>=L[j]) break;
   L[s]=L[j];     //用s记录待插入元素的位置
   s=j;
  }//for
  L[s]=t;       //将备份元素插入由s所指出的插入位置
 }
 public void HeapSort(int[] L){
  int i,t;
  for(i=L.length/2-1;i>=0;i--) //把L[0...n]调整为大根堆
   HeapAdjust(L,i,L.length-1);
  for(i=L.length-1;i>0;i--){  //堆顶元素L[0]与序列的最后元素L[i]交换
   t=L[0];
   L[0]=L[i];
   L[i]=t;
   HeapAdjust(L,0,i-1);
  }//for
 }


public static void main(String[] args){
  SortMethod test = new SortMethod();
  final int MAX = 10;
  int[] n = new int[MAX];
  System.out.println("Before Sort:");
  for(int i=0;i<n.length;i++)
   {
    n[i]=(int)(Math.random()*MAX);
    System.out.print(n[i]+" ");    
   }
  test.SelectSort(n);
  System.out.println("\nAfter Sort:");
  for(int i=0;i<n.length;i++)
   System.out.print(n[i]+" ");
 }

}


1. 冒泡法排序:
for (i=0;i<N;i++)
    for(j=i+1;j<N;i++)
       if (a[i]>a[j])
  {t=a[i];a[i]=a[j];a[j]=t;}


2.韵年的判定方法
int main()
{
  int year;
  bool leap;
  cout<<"please enter year:";
  cin>>year;
  if (year%4==0)
    {if(year%100==0)
      {if (year%400==0)
          leap=true;
       else leap=false;}
     else
leap=true;}
  else
      leap=false;
  if (leap)
     cout<<year<<" is ";
  else
     cout<<year<<" is not ";
     cout<<" a leap year."<<endl;
  return 0;
}


3.保留小数点后4位数字,注意头文件中包含iomanip;


#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
double a=22.0,b=7.0;
cout<<setiosflags(ios::scientific)<<setprecision(4)<<a/b<<endl;  


}




4. cout.put(*(a+i)); 等效于: cout<<*(a+i);


5.#include <iostream>
using namespace std;
int main()
{void convert(int n);
 int number;
 cout<<"input an integer:";
 cin>>number;
 cout<<"output:"<<endl;
 if (number<0)
  {cout<<"-";
   number=-number;
   }
  convert(number);
  cout<<endl;
  return 0;



void convert(int n)     //求数n的各位数字,并分别输出,n可为负数         
 {int i;
  char  c;
  if ((i=n/10)!=0)
    convert(i);
  c=n%10+'0';
  cout<<" "<<c;
  }


6.求字符串长度算法
int fun(char *s)
{ char *p=s;
while(*p!='\0')p++;
return (p-s);
}
 
7.求数组a[]的前n项之和;
template<class T>
T Rsum(T a[],int n)
{
  if(n>0)
     return Rsum(a,n-1)+a[n-1];
   return 0;
}


7.将数组A中每隔20个数字,求和求其平均值,按从小到大排列在数组B中!!
void Sample::funSort(Sample &s)
{
  int i, j = 0, cnt = 0 ;
  double val = 0.0 ;
  for(i = 0 ; i < Max ; i++) {
    cnt++ ;
    val += s.A[i] ;
    if(cnt % 20 == 0) {
      s.B[j++] = val / 20. ;
      val = 0 ;
    }
  }
  for(i = 0 ; i < 10 ; i++)
    for( j = i + 1 ; j < 10 ; j ++)
      if(s.B[i] > s.B[j]) {
        val = s.B[i] ;
        s.B[i] = s.B[j] ;
        s.B[j] = val ;
      }
}




8.统计数组A中的数十位数字是2,4,8的数个数toCnt,以及求出所有不满足条件的数的算术平均值;




void Sample::calValue(Sample &s)
{
  int i, sw ;
  double he = 0.0 ;


  for(i = 0 ; i < Max ; i++) {
    sw = (s.A[i] % 100) / 10 ;
    if(sw == 2 || sw == 4 || sw == 8) s.totCnt++ ;
    else he = he + s.A[i] ;
  }
  s.totPjz = he / (160 - s.totCnt) ;
}


9.//汉诺塔问题


#include<iostream>
using namespace std;
void hanoi(int ,int ,int,int);
int main()
{
int j;
cout<<"输入盘子数量:";
cin>>j;
hanoi(j,1,2,3);
return 0;
}




void hanoi(int n,int p1,int p2,int p3)
{
if(n==1)
cout<<"盘子从"<<p1<<"移到"<<p3<<endl;
else
{
hanoi(n-1,p1,p3,p2);

cout<<"盘子从"<<p1<<"移到"<<p3<<endl;
        hanoi(n-1,p2,p1,p3);



}
}




10.    本题主要考查了归并排序算法。对两个已排好的线性表进行排序时,只要依次从两个表的表头开始遍历,如果表1的当前值小于表2的当前值,则将表1的记录推进1位,否则推进表2的记录,直到某个表遍历结束,然后将未遍历完的顺序表中的其余记录复制到新表中即可。在本题中,分配了一个临时的存储空间。参考代码如下:
void SortedList::mergeFrom(const SortedList& list){  //将 list 合并到当前有序数据表中
double *t=new double[len+list.len];
int i=0,j=0;
while(i<len&&j<list.len)
{
if(d[i]<list.d[j])
t[i+j]=d[i++];
else
t[i+j]=list.d[j++];
}
if(i==len)
for(int k=j;k<list.len;++k)
t[i+k]=list.d[k];
else
for(int k=i;k<len;++k)
t[j+k]=d[k];
delete []d;
d=t;
len+=list.len;
}






11.   int MyString::wordCount() const
{


 char*s=str;
 int n=0;
 bool flag;
 flag=false;
 while(*s)
 {
if(*s>'a'&&*s<'z'||*s>'A'&&*s<'Z')
flag=true;
else 
if(*s=='\0'||*s==' ')
{ n++;
flag=false;}
s++;
 
 }
 if(flag=true)++n;


return n;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值