您的位置:首页 > 编程语言 > C语言/C++

C++常见排序方法实现

2012-03-07 23:20 711 查看
 

#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);
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ insert date 算法