#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;
}
常见的排序
最新推荐文章于 2024-07-20 09:21:06 发布