内部排序

来源:互联网 发布:红手指软件原理 编辑:程序博客网 时间:2024/05/04 16:40

//插入排序

void InsertSort(int* data, int length)
{
     for(int i=1;i<length;i++)
     {
         int tmp = data[i];
          int j = i-1;
     while(j>=0 &&tmp<data[j])
     {
         data[j+1] = data[j];
        j--;
     }
       data[j+1] = tmp;
    }
}

//选择排序

void SelectSort(int* data,int length)
{
       int i;
       int j;
       int k;
       for(i=0;i<length-1;i++)
       {
            k = i;
            for(j=i+1;j<length;j++)
          {
             if(data[k] > data[j])
             {
                 k = j;
             }
     }
  
      int tmp = data[k];
      data[k] = data[i];
     data[i] = tmp;
    }
}

//2分排序

void BInsertSort(int* data,int length)
{
 for(int i=1;i<=length-1;i++)
 {
  int low = 0;
  int high = i-1;
  int  tmp = data[i];
  while(low <= high)
  {
   int mid = (low+high)/2;
   if(data[mid] >tmp)
    high = mid -1;
   else
    low = mid+1;
  }
  
  for(int j=i-1;j>=high+1;j--)
   data[j+1] = data[j];
  data[j+1] = tmp;
 }
 
}

 

//冒泡排序

void BubbleSort(int* data,int length)
{
 int tmp;
 for(int i=0;i<length;i++)
 {
  for(int j=length-1;j>=i+1;j--)
  {
   if(data[j] < data[j-1])
   {
    tmp = data[j-1];
    data[j-1] = data[j];
    data[j] = tmp;
   }
  }
 }
}

 

//快速排序

void QuickSort(int* data,int Start, int End)
{
 int low = Start;
 int high = End;
 if(low < high)
 {
  int tmp = data[low];
  while(low != high)
  {
   while(low < high && data[high] > tmp)
    high--;
   if(low < high)
   {
    data[low] = data[high];
    low++;
   }
   
   while(low < high && data[low] < tmp)
    low++;
   if(low < high)
   {
    data[high] = data[low];
    high++;
   }
  }
  data[low] = tmp;
  QuickSort(data,Start,low-1);
  QuickSort(data,low+1,End);
 }
}

 

//希尔排序

void ShellSort(int* data, int length)
{
 int i;
 int j;
 int tmp;
 int gap = length/2;
 while(gap > 0)
 {
  for(i=gap;i<length;i++)
  {
   j = i-gap;
   tmp = data[i];
   while(j>=0&&data[j]>tmp)
   {
    data[j+gap] = data[j];
    j = j-gap;
   }
   data[j+gap] = tmp;
  }
  gap = gap/2;
 }
}

 

//归并排序(2项合并)

void MergeSort(int* data,int low,int mid, int high)
{
 int* tmpArray = new int[high-low+1];
 int i = low;
 int j = mid+1;
 int k=0;
 while(i<=mid&&j<=high)
 {
  if(data[i] <= data[j])
  {
   tmpArray[k] = data[i];
   k++;
   i++;
  }
  else
  {
   tmpArray[k] = data[j];
   k++;
   j++;
  }
 }
 
 while(i<=mid)
 {
  tmpArray[k] = data[i];
  k++;
  i++;
 }
 while(j<=high)
 {
  tmpArray[k] = data[j];
  k++;
  j++;
 }

 for(k=0,i=low;i<=high;k++,i++)
  data[i] = tmpArray[k];

 delete[] tmpArray;
}

void MergePass(int* data,int k,int n)
{
 int i;
 for(i=0;i+2*k-1<n;i=i+2*k)
 {
  MergeSort(data,i,i+k-1,i+2*k-1);
 }

 if(i+k-1< n)
 {
  MergeSort(data,i,i+k-1,n-1);
 }
}
void Merge(int* data,int length)
{
 for(int i=1;i<length;i = i*2)
 {
  MergePass(data,i,length);
 }
}

 

//堆排序

void Sift(int* data,int low,int high)
{
 int i = low;
 int j = 2*i;
 int tmp = data[i];
 while(j <= high)
 {
  if(j<high && data[j] < data[j+1])
  {
   j++;
  }

  if(tmp < data[j])
  {
   data[i] = data[j];
   i = j;
   j = 2*i;
  }
  else
   break;
 }

 data[i] = tmp;
}

void HeapSort(int* data, int n)
{
 int i;
 int tmp;
 for(i= n/2;i>=0;i--)
  Sift(data,i,n);
 for(i=n;i>=1;i--)
 {
  tmp = data[1];
  data[1] = data[i];
  data[i] = tmp;
  Sift(data,1,i-1);
 }
  
}

原创粉丝点击