常见的排序

#include<iostream>
#include<vector>
using namespace std;
//冒泡
//最好O(n),最坏O(n2),平均O(n2)
//O(1),稳定
int *bubble(int a[],int len) {  
	for (int i = 0; i < len - 1; ++i) {
		for (int j = 0; j < len - 1 - i; ++j) {
			if (a[j] > a[j + 1]) {
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	return a;
}
//选择
//最好O(n2),最坏O(n2),平均O(n2)
//O(1),不稳定
int *select(int a[], int len) {  
	for (int i = 0; i < len - 1; ++i) {
		int min = a[i];
		for (int j = i + 1; j < len; ++j) {
			if (a[j] < min) {
				int temp = a[j];
				a[j] = min;
				min = temp;
			}
		}
	}
	return a;
}
//快速
//最好O(nlogn),最坏O(n2),平均O(nlogn)
//O(nlogn),不稳定
int *quick(int a[], int start,int end) {  
	int l=start, r=end;
	if (l >= r) return a;
	int pivot = l;
	while (l < r) {
		while (a[r] > a[pivot]) --r;
		while (a[l] < a[pivot]) ++l;
		if (l < r) {
			int temp = a[r];
			a[r] = a[l];
			a[l] = temp;
		}
	}
	quick(a, start, l-1);
	quick(a, r+1, end);
}
//堆
//最好O(nlogn),最坏O(nlogn),平均O(nlogn)
//O(1),不稳定
int *make_heap(int a[], int len) {
	for (int i = len - 1; i >= 0; --i) {
		if (i % 2 && a[i] > a[(i - 1) / 2]) swap(a[i], a[(i - 1) / 2]);
		else if (!(i % 2) && a[i] > a[i / 2]) swap(a[i], a[i / 2]);
	}
	return a;
}
int *heap(int a[], int len) {
	int* h=NULL;
	while (len) {
		h = make_heap(a, len);
		len--; 
		swap(h[0], h[len]);
	}
	return h;
}
//插入
//最好O(n),最坏O(n2),平均O(n2)
//O(1),稳定
int *insert(int a[], int len) {
	for (int i = 1; i < len; ++i) {
		int num = a[i], j;
		for (j = i - 1; j >= 0; --j) {
			if (a[j] > num)
				a[j + 1] = a[j];
			else
				break;
		}
		a[j+1] = num;
	}
	return a;
}

//希尔
//最好O(n1,3),最坏O(n2),平均O(n2),和interval有关
//O(1),稳定
int *shell(int a[], int len) {
	for (int interval = len / 2; interval > 0; interval /= 2) {
		for (int i = interval; i < len; ++i) {
			int num = a[i], j;
			for (j = i - interval; j >= 0; j -= interval) {
				if (a[j] > num)
					a[j + interval] = a[j];
				else break;
			}
			a[j + interval] = num;
		}
	}
	return a;
}
//归并
//最好O(nlogn),最坏O(nlogn),平均O(nlogn)
//O(n),不稳定
vector<int> merge(int a[], int start, int end) {
	vector<int> res;
	if (start >= end) return vector<int>(1, a[start]);
	int mid = start + (end - start) / 2;
	vector<int> l = merge(a, start, mid);
	vector<int> r = merge(a, mid + 1, end);
	int ll = 0, rr = 0;

	const int llen = l.size();
	const int rlen = r.size();

	while (ll < llen&&rr < rlen) {
		if (l[ll] < r[rr]) res.push_back(l[ll++]);
		else res.push_back(r[rr++]);
	}
	while (ll < llen) res.push_back(l[ll++]);
	while (rr < rlen) res.push_back(r[rr++]);
	return res;
}

int main() {
	int a[7] = { 4,5,2,3,8,1,0 };
	int *res = bubble(a,7);
	cout << "冒泡排序" << ":";
	for (int i = 0; i < 7; ++i) {
		cout << res[i]<<" ";
	}
	cout << endl;

	int *res1 = select(a, 7);
	cout << "选择排序" << ":";
	for (int i = 0; i < 7; ++i) {
		cout << res1[i] << " ";
	}
	cout << endl;

	int *res2 = quick(a, 0,6);
	cout << "快速排序" << ":";
	for (int i = 0; i < 7; ++i) {
		cout <<res2[i] << " ";
	}
	cout << endl;

	vector<int> res3 = merge(a, 0, 6);
	cout << "归并排序" << ":";
	for (int i = 0; i < 7; ++i) {
		cout <<res3[i] << " ";
	}
	cout << endl;

	int *res4 = insert(a,7);
	cout << "插入排序" << ":";
	for (int i = 0; i < 7; ++i) {
		cout << res4[i] << " ";
	}
	cout << endl;

	int *res5 = shell(a, 7);
	cout << "希尔排序" << ":";
	for (int i = 0; i < 7; ++i) {
		cout << res5[i] << " ";
	}
	cout << endl;

	int *res6 = heap(a, 7);
	cout << "堆排序" << "  :";
	for (int i = 0; i < 7; ++i) {
		cout << res6[i] << " ";
	}
	cout << endl;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值