编程菜鸟的日记-初学尝试编程-整理内部排序(交换排序(冒泡排序和快速排序)、直接选择排序、直接插入排序,希尔排序)

//首先是交换排序中的冒泡排序,时间复杂度o(n^2),最好情况下是正序则交换次数为0,时间复杂度为o(n)
//空间复杂度为o(1)
//是一个稳定的排序算法
#include <iostream>
using namespace std;
typedef int ElemType;
void BubbleSort(ElemType R[],int n)
{
 int i,j,temp;
 for(i=0;i<n-1;i++)//注意i的范围只有0 ~ (n-1),n个数只需要比较n-1次即可
 {
  for(j=n-1;j>i;j--)//将第i+1至n-1个数进行逐个比较,从后往前比较,较小的交换到前面的位置
  {
   if(R[j]<R[j-1])
   {
    temp=R[j];
    R[j]=R[j-1];
    R[j-1]=temp;
   }
  }
 }
}
//交换排序中的快速排序,被认为是最高效的排序算法
//时间复杂度最好的是o(n*log2 n),(此时序列基准刚好是中指)
//时间复杂度最差的是o(n^2),空间复杂度为o(1),不稳定
void QuickSort(ElemType R[],int begin,int end)
{
 int i=begin,j=end;//分别是R的开始位置和结束位置
 if(begin<end)
 {
  ElemType temp=R[begin];//将第一个元素作为基准元素
  while(i!=j)
  {
   while(j>i && R[j]>=temp)
    j--;
   R[i]=R[j];
   while(i<j && R[i]<=temp)
    i++;
   R[j]=R[i];
  }
  R[i]=temp;
  QuickSort(R,begin,i-1);//从第i个位置分成左右两段,对左区域进行排序,
  QuickSort(R,i+1,end);//对右区域进行排序
 }
 
}
//选择排序:直接选择排序(简单选择排序),它是一个就地排序。
//时间复杂度o(n^2),空间复杂度为o(1)
void SelectSort(ElemType R[],int n)
{
 ElemType temp;
 for(int i=0;i<n-1;i++)//i为无序区,从0开始一直到数组最后一个
 {
  int k=i;
  for(int j=i+1;j<=n-1;j++)
  {
   if(R[j]<R[k])
    k=j;
   //if(k!=i)
   {
    temp=R[k];
    R[k]=R[i];
    R[i]=temp;
   }
  }
 }
}
//堆排序:
//插入排序:直接插入排序和shell排序
//将关键字的值直接插入到前面已经排好序的序列中,直到全部待排序的全部插入完成为止
//直接插入排序,稳定的排序方法
void InsertSort(ElemType R[],int n)
{
 ElemType temp;
 for(int i=1;i<=n-1;i++)
 {
  temp=R[i];
  int j=i-1;
  while(j>=0 && temp<R[j])
  {
   R[j+1]=R[j];
   j--;
  }
  R[j+1]=temp;//在j+1处插入R[i]
 }
}
//shell排序:分组插入,先取增量为d,进行分组,进行组内插入排序,
//然后增量d逐渐减小,重复上述过程,直到增量为1,所有记录在同一组中进行直接插入排序为止
void ShellSort(ElemType R[],int n)
{
 int i,j,gap;
 ElemType temp;
 gap=n/2;
 while(gap>0)
 {
  for(i=gap;i<n;i++)
  {
   temp=R[i];
   j=i-gap;
   while(j>=0 && temp<R[j])
   {
    R[j+gap]=R[j];
    j=j-gap;
   }
   R[j+gap]=temp;
   j=j-gap;
  }
  gap=gap/2;//减小增量
 }
}

void main()

 ElemType R[]={1,4,3,2,0};
 int n=sizeof(R)/sizeof(ElemType);
 //BubbleSort(R,n);
 //QuickSort(R,0,n-1);
 //SelectSort(R,n);
    //InsertSort(R,n);
 ShellSort(R,n);
 for(int i=0;i<=n-1;i++)
 {
  cout<<R[i]<<" ";
 }
 cout<<endl;
 system("pause");
}

 

posted @ 2013-11-06 19:50  编程的爬行者  阅读(237)  评论(0编辑  收藏  举报