排序算法,快速排序,希尔排序,冒泡排序
来源:互联网 发布:个人网络招商 编辑:程序博客网 时间:2024/06/10 14:00
排序算法模板,包括快速排序,希尔排序,冒泡排序
快速排序:以数据为基准的左右二分排序
希尔排序:缩小增量的排序
需要使用可以直接下载文件使用
/*
*file : sort.h
*author : oliver ou
*/
#define _AGILE_SORT_H_
#include <iostream>
#include <vector>
//比较函数,返回较大的那个
typedef void* (*GetGreater)(void*, void*);
//排序类
template<typename Type>
class AgileSort
{
public:
~AgileSort()
{
};
//单例调用 AgileSort<Class>::Instance().QiuckSortAsc(...)
static AgileSort& Instance()
{
static AgileSort<Type> instance;
return instance;
}
//快速排序,升序
void QiuckSortAsc(std::vector<Type>& data, GetGreater func = NULL)
{
size_t start = 0;
QiuckSort(data, start, data.size() - 1, true, func);
};
//快速排序,降序
void QiuckSortDes(std::vector<Type>& data, GetGreater func = NULL)
{
size_t start = 0;
QiuckSort(data, start, data.size() - 1, false , func);
};
//希尔排序,升序
void ShellSortAsc(std::vector<Type>& data, size_t interval, GetGreater func = NULL)
{
while (interval > 0)
{
ShellSortHelp(data, interval--, true, func);
}
};
//希尔排序,降序
void ShellSortDes(std::vector<Type>& data, size_t interval, GetGreater func = NULL)
{
while (interval > 0)
{
ShellSortHelp(data, interval--, false, func);
}
};
//冒泡排序,升序
void BubbleSortAsc(std::vector<Type>& data, GetGreater func = NULL)
{
BubbleSort(data, true, func);
};
//冒泡排序,降序
void BubbleSortDes(std::vector<Type>& data, GetGreater func = NULL)
{
BubbleSort(data, false, func);
};
private:
AgileSort()
{
};
//交换
void Swap(std::vector<Type>& data, size_t i, size_t j)
{
Type temp = data[i];
data[i] = data[j];
data[j] = temp;
};
//快速排序递归
void QiuckSort(std::vector<Type>& data, size_t& start, size_t end, bool isAscend, GetGreater func = NULL)
{
if (start >= end || start >= data.size() || end >= data.size() )
{
return;
}
size_t left = start;
QiuckSortHelp(data, start, end, isAscend, func);
size_t right = start + 1;
QiuckSort(data, left, start - 1, isAscend, func);
QiuckSort(data, right, end, isAscend, func);
};
void QiuckSortHelp(std::vector<Type>& data, size_t& start, size_t end, bool isAscend, GetGreater func = NULL)
{
size_t i = start + 1;
while (i <= end)
{
if (func)
{
if (isAscend)
{
if (&data[i] == (*func)(&data[start], &data[i]))
{
Swap(data, start++, start);
if (start != i)
{
Swap(data, start - 1, i);
}
}
}
else
{
if (&data[start] == (*func)(&data[start], &data[i]))
{
Swap(data, start++, start);
if (start != i)
{
Swap(data, start - 1, i);
}
}
}
}
else
{
if (isAscend)
{
if (data[start] > data[i])
{
Swap(data, start++, start);
if (start != i)
{
Swap(data, start - 1, i);
}
}
}
else
{
if (data[start] < data[i])
{
Swap(data, start++, start);
if (start != i)
{
Swap(data, start - 1, i);
}
}
}
}
i++;
}
};
void ShellSortHelp(std::vector<Type>& data, size_t interval, bool isAscend, GetGreater func = NULL)
{
int size = (int)data.size();
int loopSize = size / (int)interval;
int i = 0;
while (i < loopSize)
{
int end = i + (size - i - 1) / interval * interval;
int m = i;
int n = end;
while (m < end)
{
n = end;
while (n > m)
{
int next = n - interval;
if (next >= i)
{
if (func)
{
if (isAscend)
{
if (&data[n] == (*func)(&data[next], &data[n]))
{
Swap(data, next, n);
}
}
else
{
if (&data[next] == (*func)(&data[next], &data[n]))
{
Swap(data, next, n);
}
}
}
else
{
if (isAscend)
{
if (data[next] > data[n])
{
Swap(data, next, n);
}
}
else
{
if (data[next] < data[n])
{
Swap(data, next, n);
}
}
}
}
n -= interval;
}
m += interval;
}
i++;
}
};
void BubbleSort(std::vector<Type>& data, bool isAscend, GetGreater func = NULL)
{
int size = (int)data.size() - 1;
int j = size;
for (int i = 0; i < size; i++)
{
j = size;
while (j > i )
{
int next = j - 1;
if (func)
{
if (isAscend)
{
if (&data[j] == (*func)(&data[next], &data[j]))
{
Swap(data, next, j);
}
}
else
{
if (&data[next] == (*func)(&data[next], &data[j]))
{
Swap(data, next, j);
}
}
}
else
{
if (isAscend)
{
if (data[next] > data[j])
{
Swap(data, next, j);
}
}
else
{
if (data[next] < data[j])
{
Swap(data, next, j);
}
}
}
j--;
}
}
};
};
#endif //_AGILE_SORT_H_
0 0
- 排序算法,快速排序,希尔排序,冒泡排序
- 常用的排序算法:插入排序,希尔排序,冒泡排序,选择排序,快速排序,归并排序
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序...)
- 冒泡排序,选择排序,插入排序,希尔排序,合并排序,快速排序算法
- C++ ------------排序算法(冒泡排序-快速排序-选择排序-插入排序-希尔排序)
- 冒泡、插入、希尔和快速排序算法
- 排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 七种排序算法,包括:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 八大排序算法总结之一(冒泡排序,快速排序,直接插入排序,希尔排序)
- C++算法 冒泡排序,快速排序,插入排序,希尔排序,计数排序,基数排序 性能比较
- 八大排序算法总结之一(冒泡排序,快速排序,直接插入排序,希尔排序)
- 排序算法.希尔排序&快速排序
- 希尔排序(+冒泡排序)
- 快速排序,冒泡排序,插入排序,希尔排序
- 直接插入排序、希尔排序、冒泡排序、快速排序
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)
- Cocos2d-JS自动JSB绑定规则修改
- 各路大神请点进来!
- [leetcode][array] Pascal's Triangle
- hdoj1285 拓扑排序
- java heap space
- 排序算法,快速排序,希尔排序,冒泡排序
- 文章标题
- 欧拉工程第34题:Digit factorials
- CoreData表关联
- usr/bin/ld: cannot find -l<nameOfTheLibrary>
- 网易OpenStack部署运维实战
- socket通信机制
- FastDFS Storage配置详解
- Linux的SOCKET编程详解