C++常见排序方法实现

 

#pragma once
/*
*description:排序算法类
*author: qjf
*Date: 2012/3/2
**/
class MySort
{
public:
 MySort(void);
 ~MySort(void);
 static void Bubble_sort(int* arr,unsigned int size); //冒泡排序
 static void Insert_sort(int* arr,unsigned int size); //插入排序
 static void Heap_sort(int* arr, unsigned int size);  //堆排序
 static void Dicho_sort(int* arr,unsigned int size);  //二分排序
 static void Celerity_sort(int* arr,unsigned int sIndex,unsigned int size); //快速排序
private:
 static void Adjust_heap(int* arr,unsigned int size,unsigned int pos); //调整堆
};

#include "StdAfx.h"
#include "MySort.h"

MySort::MySort(void)
{
}

MySort::~MySort(void)
{
}
/*
*@description: 冒泡排序
*@param arr: 待排序数组
*@param size: 数组大小
*/
void MySort::Bubble_sort(int *arr, unsigned int size)
{
 if (size == 0)
  return;
 int temp,i,j;
 for (i = 0; i < size-1; i++)
 {
  for (j = i+1; j < size ; j++)
  {
   if (arr[i] > arr[j])
   {
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
   }
  }
 }
}
/*
*@description: 插入排序
*@param arr: 待排序数组
*@param size: 数组大小
*/
void MySort::Insert_sort(int* arr,unsigned int size)
{
 if(size == 0)
  return;
 int i,j,temp;
 for (i=1;i<size;i++)
 {
  temp = arr[i];
  //如果满足条件则元素向后移动
  for (j = i;j>0&&temp>arr[j-1];j--)
  {
   arr[j] = arr[j-1];
  }
  //插入
  arr[j] = temp;
 }
}

/*
*@description: 堆排序
*@param arr: 待排序数组
*@param size: 数组大小
*/

void MySort::Heap_sort(int* arr, unsigned int size)
{
 if(size == 0)
  return;
 int i = size/2-1;
 int temp;
 for (i;i>=0;--i)
 {
  Adjust_heap(arr,size,i); //调整堆
 } //创建最大堆
 //循环依次取出最小元素,即每取一个数则都把堆顶元素与堆尾元素交换
 //然后再对剩下的i个元素(即从0到i,已取出的元素则换至每次的堆尾不进行调整)
 //调整堆...
 for (i=size-1;i>0;--i)
 {
  temp = arr[0];
  arr[0] = arr[i];
  arr[i] = temp;
  Adjust_heap(arr,i,0);
 }
}
/*
*@description: 二分插入排序
*@param arr: 待排序数组
*@param size: 数组大小
*/
void MySort::Dicho_sort(int* arr,unsigned int size)
{
 if (size == 0)
  return;
 //key 要插入的元素,left 左位置,right 右位置
 int key, left, right, middle; 
 for (int i=1; i<size; i++) 
 { 
  key = arr[i]; 
  left = 0; 
  right = i-1; 
  while (left<=right) 
  { 
   middle = (left+right)/2; 
   if (arr[middle]>key) 
    right = middle-1; 
   else 
    left = middle+1; 
  } 
  //查找到元素插入的位置则之后的元素都像后移一位
  for(int j=i-1; j>=left; j--) 
  { 
   arr[j+1] = arr[j]; 
  } 

  arr[left] = key;        
 } 
}
/*
*@description: 调整堆
*@param arr: 待调整数组
*@param size: 数组大小
*@param pos: 待调整的父节点位置
*/
void MySort::Adjust_heap(int* arr,unsigned int size,unsigned int pos)
{
 if (size == 0)
  return;
 int temp,nchild=0;
 for (temp = arr[pos];2*pos+1<size;pos=nchild)
 {
  nchild = 2*pos+1; //左节点位置
  //选择子节点中最大的节点元素
  if (nchild<size-1 && arr[nchild] < arr[nchild + 1])
  {
   ++nchild;
  }
  //如果父节点小于子节点则交换
  if (temp < arr[nchild] )
  {
   arr[pos] = arr[nchild];
  }
  else
   break;
  arr[nchild] = temp;
 }
}
/*
*@description: 快速排序
*@param arr: 待排序数组
*@param startIndex: 开始位置
*@param size: 结束位置
*/
void MySort::Celerity_sort(int* arr,unsigned int startIndex ,unsigned int endIndex)
{
 if (endIndex ==0 || startIndex >= endIndex)
  return;
 int start = startIndex,end = endIndex;
 int key = arr[startIndex]; //取关键元素
 int temp;
 //将比关键元素大的放在关键元素后面
 //将比关键元素小的放在关键元素前面
 while(start != end)
 {
  //从后往前比较
  while(arr[end] >= key && start < end) end--;
  temp = arr[end];
  arr[end] = arr[start];
  arr[start] = temp;
  //从前往后比较
  while(arr[start] <= key && start < end) start++;
  temp = arr[start];
  arr[start] = arr[end];
  arr[end] = temp;
 }
 arr[start] = key;
 Celerity_sort(arr,startIndex,start);
 Celerity_sort(arr,start + 1,endIndex);
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值