/*比较方法*/
static bool less(T a, T b) {
return a < b; //调用比较方法
}
/*交换方法*/
static void exchange(T a[], int i, int j) {
T temp = a[i];
a[i] = a[j];
a[j] = temp;
}
/*打印方法*/
static void show(T a[], int Len) {
cout << "数组元素:";
for (int i = 0; i < Len; i++) {
cout << a[i] << " ";
}
cout << endl;
}
/*判断有序方法*/
static bool isSorted(T a[], int Len) {
for (int i = 1; i < Len; i++) {
if (less(a[i], a[i - 1]))
return false;
}
return true;
}
void SelectSort(T a[], int Len) {
int min;
for (int i = 0; i < Len - 1; i++) {
min = i;
for (int j = i + 1; j < Len; j++) {
if (less(a[j], a[min]))//比较函数
min = j;
}
exchange(a, i, min);//交换函数
}
}
//插入排序
void InsertSort(T a[],int Len){
int j;
for(int i=1;i0){//比较操作
exchange(a,j, j-1);//交换操作
j--;
}
}
}
运行时间与输入元素的初始顺序有关
比较次数:最好:N-1;最坏:N*N/2;平均:N*N/4
交换次数:最好:0;最坏:N*N/2;平均:N*N/4
倒置很少时,排序效率可能是算法中最好的
void InsertSortNoCheck(T a[], int Len) {
//找到最小值
int min = 0;
for (int i = 1; i < Len; i++) {
if (less(a[i], a[min])) {
min = i;
}
}
exchange(a, 0, min); //将最小值交换到0处
//不用进行边界检测的插入排序
int j;
for (int i = 1; i < Len; i++) {
j = i;
while (less(a[j], a[j - 1])) { //比较操作
exchange(a, j, j - 1); //交换操作
j--;
}
}
}
void InSortPandNoExch(T a[], int Len) {
//找到最小值
int min = 0, changes = 0;
for (int i = 1; i < Len; i++) {
if (less(a[i], a[min])) {
exchange(a, i, min);
changes++;
}
}
if (changes == 0)
return;
T temp;
int j;
for (int i = 2; i < Len; i++) {
temp = a[i];
j = i-1;
while (less(temp, a[j])) { //比较操作
a[j+1] = a[j]; //移动操作
j--;
}
a[j+1] = temp;
}
}
//希尔排序
void ShellSort(T a[],int Len){
int gap=1;//增量
while(gap=1){
//按增量进行的插入排序
for(int i=gap;i0&&less(a[j], a[j-gap]);j-=gap){
exchange(a, j, j-gap);
}
}
gap=gap/3;
}
}
//归并有序数组
static void Merge(T a[],T aux[],int lo,int mid,int hi){
//复制数据到辅助数组
for(int i=lo;i<=hi;i++){
aux[i]=a[i];
}
//归并
int i=lo,j=mid+1;
for(int k=lo;k<=hi;k++){
if(i>mid) a[k]=aux[j++];
else if(j>hi) a[k]=aux[i++];
else if(less(aux[i], aux[j])) a[k]=aux[i++];
else a[k]=aux[j++];
}
}
/**
* 自顶向下的归并排序
*/
static void MergeSort(T a[],T aux[],int lo,int hi){
if(hi<=lo) return ;
int mid=(lo+hi)/2;
MergeSort(a,aux, lo, mid);
MergeSort(a, aux,mid+1, hi);
if(a[mid]>a[mid+1]){
Merge(a, aux,lo, mid, hi);
}
}
/**
* 自底向上的归并排序
* 效率:与自顶向下的归并排序效率相当
*/
static void MergeSortBU(T a[],T aux[],int Len){
for(int aSize=1;aSize(Len-1)? Len-1:hi;
Merge(a, aux, lo, mid, hi);
}
}
}
/*在指定区间上的插入排序*/
static void InsertSortLimit(T a[],int lo,int hi){
for(int i=lo+1;i<=hi;i++){
for(int j=i;less(a[j],a[j-1])&&j>lo;j--){
exchange(a, j-1, j);
}
}
}
//归并·排序
static void MergeSort(T a[],T aux[],int lo,int hi){
if(hi<=lo+15){
InsertSortLimit(a,lo,hi);
return;//如果没有return,程序就不会退出,陷入死循环
}
int mid=(lo+hi)/2;
MergeSort(a,aux, lo, mid);
MergeSort(a, aux,mid+1, hi);
if(a[mid]>a[mid+1]){
Merge(a, aux,lo, mid, hi);
}
}
static void MergeSortBU(T a[],T aux[],int Len){
for(int aSize=1;aSize(Len-1)? Len-1:hi;
if(a[mid]>a[mid+1]){
Merge(a, aux, lo, mid, hi);
}
}
}
}
//切分方法
static int partition(T a[],int lo,int hi){
int i=lo,j=hi+1;//扫描指针
T part=a[lo];//切分元素
while(1){
while(less(a[++i],part)){
if(i==hi) break;
}
while(less(part, a[--j])){
}
if(i>=j) break;
exchange(a, i, j);
}
exchange(a, lo, j);
return j;
}
//快速排序递归
static void QuickSort(T a[],int lo,int hi){
if(lo>=hi) return;
int part=partition(a, lo, hi);
QuickSort(a, lo,part-1);
QuickSort(a, part+1, hi);
}
//快速排序调用
static void QuickSort(T a[],int Len){
QuickSort(a,0,Len-1);
}
/*在指定区间上的插入排序*/
static void InsertSortLimit(T a[],int lo,int hi){
for(int i=lo+1;i<=hi;i++){
for(int j=i;less(a[j],a[j-1])&&j>lo;j--){
exchange(a, j-1, j);
}
}
}
static void QuickSort(T a[],int lo,int hi){
if(hi<=lo+15){
InsertSortLimit(a, lo, hi);
return;//需要返回,不然会无穷递归
}
int part=partition(a, lo, hi);
QuickSort(a, lo,part-1);
QuickSort(a, part+1, hi);
}
static void QuickSortSub3(T a[],int lo,int hi){
if(lo>=hi) return;
int part=partition3(a, lo, hi);
QuickSortSub3(a, lo,part-1);
QuickSortSub3(a, part+1, hi);
}
//三取样切分
static T sub3partition(T a[],int lo,int hi){
T part;
if(hi-lo<2){
return a[lo];
}
T v1=a[lo],v2=a[lo+1],v3=a[lo+2];
int index;
//获取中位数:2次比较
if( (v1-v2)*(v2-v3)>0 )
index=lo+1;
else if( (v2-v1)*(v1-v3)>0 )
index=lo;
else index=lo+2;
part=a[index];
exchange(a,lo, index);
return part;
}
static int partition3(T a[],int lo,int hi){
int i=lo,j=hi+1;//扫描指针
T part=sub3partition(a, lo,hi);
while(1){
while(less(a[++i],part)){
if(i==hi) break;
}
while(less(part,a[--j])){ }
if(i>=j) break;
exchange(a,i,j);
}
exchange(a,lo,j);
return j;
}
//选取中位数:一行代码
//index= v1 > v2 ? (v2 > v3 ? lo+1 : (v1>v3? lo+2:lo)) : (v1 > v3 ? lo: (v2>v3? lo+2:lo+1));
//获取中位数:2次比较
if( (v1-v2)*(v2-v3)>0 )
index=lo+1;
else if( (v2-v1)*(v1-v3)>0 )
index=lo;
else index=lo+2;
void QuickSortManyRepeat(T a[],int lo,int hi){
if(hi<=lo) return;
int lt=lo,i=lo+1,gt=hi;
T v=a[lo];
while(i<=gt){
if(a[i]v) exchange(a,gt--,i);
else i++;
}
QuickSortManyRepeat(a, lo, lt-1);
QuickSortManyRepeat(a, gt+1, hi);
}
class PriorityQueue{
private:
//队列最大长度
int maxSize;
//队列长度
int N=0;
//优先队列
T* pq;
//元素比较
bool less(int i,int j){}
//元素交换
void exchange(int i,int j){}
//上浮操作
void swim(int k){}
//下沉操作
void sink(int k){}
//动态调整队列长度
void reSize(int Len){}
public:
//创建最大容量为max的优先队列
MaxPQ(int max){}
//向优先队列中插入一个元素
void insert(T v){}
//返回最大元素
T max(){}
//删除并返回最大元素
T delMax(){}
//返回队列是否是空
bool isEmpty(){}
//返回优先队列中元素的数目
int size(){}
}
//上浮:
void swim(int k){
while(k>1&&less(k/2,k)){
exchange(k/2,k);
k=k/2;
}
}
//下沉:
void sink(int k){
while(2*k<=N){
int j=2*k;
if(j
template
class MaxPQ{
private:
//队列最大长度
int maxSize;
//队列长度
int N=0;
//优先队列
T* pq;
//元素比较
bool less(int i,int j){
return pq[i]1&&less(k/2,k)){
exchange(k/2,k);
k=k/2;
}
}
//下沉操作
void sink(int k){
while(2*k<=N){
int j=2*k;
if(j
/**
* 堆排序
*/
template
class HeapSort{
private:
//元素比较
bool less(T a,T b){
return a=1;k--){
sink(a,k,N);
}
while(N>1){
exchange(a,1-1,N-1);
N--;
sink(a,1,N);
}
}
};