排序

//1.直接插入排序,稳定
//很久以前就学过直接插入了,但是写起来还是出了挺多问题的
void inssort(int *d, int s, int e){
	for(int i = s+1; i <= e; ++i){
		int x = d[i];
		int j = i-1;
		while(j >= s && d[j] > x){
			d[j+1] = d[j];
			--j;
		}
		d[j+1] = x;
	}
}
//2.希尔排序,不稳定
//缩小增量法,增量选择,直至增量为1
//组内直接插入排序,不喜欢插入,不过还是写一下看看
void shesort(int *d, int s, int e){
	for(int dt = (e-s)>>1; dt; dt >>= 1){
		for(int i = s+dt; i <= e; ++i){
			int x = d[i];
			int j = i - dt;
			while(j >= s && d[j] > x){
				d[j+dt] = d[j];
				j -= dt;
			}
			d[j+dt] = x;
		}
	}
}
//3.冒泡排序,稳定
void bubsort(int *d, int s, int e){
	for(int i = s; i < e; ++i){
		for(int j = e; j > i; --j){
			//此处可优化,如果扫描一遍没有发生交换,表明剩余部分也已经有序,结束排序
			if(d[j-1] > d[j]){
				int t = d[j]; d[j] = d[j-1]; d[j-1] = t;
			}
		}
	}
}
//4.快速排序,不稳定
void qsort(int *d, int s, int e){
	if(s >= e)return;
	int l = s, r = e;
	int x = d[l];
	while(l < r){
		while(l < r && x < d[r])--r;
		if(l < r)d[l++] = d[r];
		while(l < r && x > d[l])++l;
		if(l < r)d[r--] = d[l];
	}
	d[l] = x;
	qsort(d, s, l-1);
	qsort(d, l+1, e);
}
//5.简单选择排序,不稳定
void selsort(int *d, int s, int e){
	for(int i = s; i < e; ++i){
		//也可以每次都和d[i]比较,更小则交换,但是交换次数会多一些
		int id = i;
		for(int j = i+1; j <= e; ++j){
			if(d[j] < d[id])id = j;
		}
		if(id != i){
			int t = d[id]; d[id] = d[i]; d[i] = t;
		}
	}
}
//6.堆排序,不稳定
//算法是理解的,但是从来没写过,写来试试
//下标从1开始的话比较简单,2k,2k+1,从0开始也是可以的,为了一致性,此处依然从0开始,2k+1,2k+2
//大顶堆,小顶堆,此处大顶堆,输入顺序是降序,数组变为升序
//堆调整
void heapadjust(int *d, int e, int x){
	int t = d[x];
	int child;
	while((child = 2 * x + 1) <= e){
		if(child+1 <= e && d[child+1] > d[child]){
			++child;
		}
		if(t < d[child]){
			d[x] = d[child];
			x = child;
		}else{
			break;
		}
	}
	d[x] = t;
}
//首先是非叶子的调整,然后依次替换、调整,此处默认s=0,从0开始
void heasort(int *d, int s, int e){
	for(int i = (e-1)>>1; i >= 0; --i){
		heapadjust(d, e, i);
	}
	for(int i = e; i > 0; --i){
		int t = d[i]; d[i] = d[0]; d[0] = t;
		heapadjust(d, i-1, 0);
	}
}
//7.归并排序,稳定
//典型的分治,分而治之,划分→合并
void megsort(int *d, int s, int e){
	if(s >= e)return;
	int m = (s + e)>>1;
	megsort(d, s, m);
	megsort(d, m+1, e);
	int i = s, j = m +1, p = s;
	int t[len];
	while(i <= m && j <= e){
		if(d[i] <= d[j]){
			t[p++] = d[i++];
		}else{
			t[p++] = d[j++];
		}
	}
	while(i <= m){
		t[p++] = d[i++];
	}
	while(j <= e){
		t[p++] = d[j++];
	}
	for(int i = s; i <= e; ++i){
		d[i] = t[i];
	}
}
//8.基数排序(桶,分配)
//特殊情况,不予讨论
//每一位进行
//9.计数排序
//特殊情况,不予讨论
//范围小,频度高,可列

qsort和sort,比较喜欢sort,简单一些

均可自己实现cmp,实现自定义比较,比如多重排序

qsort,c语言库函数

#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
int cmp(const void *a, const void *b );
a-b升序,反之降序
sort,c++ stl
#include <algorithm>
using std::sort;
void sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp);
bool cmp(const Type1 &a, const Type2 &b)


a<b升序,反正降序


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值