各大排序的实现

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v;
int n;
void buble_sort(void);
void insert_sort(void);
void quick_sort(int l, int r);
void merge_sort(int l, int r);
int nixudui_merge_sort(int l, int r);
int main() {
 cin >> n;
 v.resize(n);
 for (int i = 0; i < n; i++)
  cin >> v[i];
 //buble_sort();//冒泡排序
 //insert_sort();//插入排序
 //希尔排序,堆排序省略
 quick_sort(0, n - 1);//快速排序
 //merge_sort(0, n - 1);//归并排序
 //int res = nixudui_merge_sort(0, n - 1);//逆序对mergesort;
 //cout << res << endl;//逆序对
 //bucket_sort();//桶排序
 for (int i = 0; i < v.size(); i++)
  cout << v[i] << " ";
 return 0;
}
void buble_sort(void) {
 for (int p = n - 1; p > 0; p--)
  for (int i = 0; i + 1 <= p; i++)
   if (v[i] > v[i + 1])swap(v[i], v[i + 1]);
}
void insert_sort(void) {
 for (int p = 1; p < n; p++) {
  int temp = v[p],i;
  for (i = p; i > 0 && v[i - 1] > temp; i--)
   v[i] = v[i - 1];
  v[i] = temp;
 }
}
void quick_sort(int l,int r) {
 if (l >= r)return;
 int left = l, right = r;
 int x = v[l + r >> 1];
 while (l < r) {
  while (v[l] < x)l++;
  while (v[r] > x)r--;
  if (l < r)swap(v[l], v[r]);
  else quick_sort(left, l), quick_sort(l + 1, right);
 }
}
void merge_sort(int l, int r) {
 if (l >= r)return;
 int mid = l + r >> 1;
 merge_sort(l, mid);
 merge_sort(mid + 1, r);
 vector<int>temp;
 int p1 = l, p2 = mid + 1;
 while (p1 != mid + 1 && p2 != 1 + r) 
  if (v[p1] > v[p2]) temp.push_back(v[p2++]);
   else temp.push_back(v[p1++]);
 while (p1 != mid + 1) temp.push_back(v[p1++]);
 while (p2 != r + 1) temp.push_back(v[p2++]);
 for (int i = l, j = 0; i <= r; i++, j++)v[i] = temp[j];
}
int nixudui_merge_sort(int l, int r) {
 if (l >= r)return 0;
 int mid = l + r >> 1;
 int res = 0;
 res += nixudui_merge_sort(l, mid);
 res += nixudui_merge_sort(mid + 1, r);
 vector<int>temp;
 int p1 = l, p2 = mid + 1;
 while (p1 != mid + 1 && p2 != 1 + r) 
  if (v[p1] > v[p2]) {
   temp.push_back(v[p2++]);
   res += mid - p1 + 1;
  }else temp.push_back(v[p1++]);
 while (p1 != mid + 1) temp.push_back(v[p1++]);
 while (p2 != r + 1) temp.push_back(v[p2++]);
 for (int i = l, j = 0; i <= r; i++, j++)v[i] = temp[j];
 return res;
}
void bucket_sort(void) {
 vector<vector<int>>bucket;
 for (int i = 1; i <= 3; i++) {//假设所有数字都<=999
  vector<int>temp;
  for (int j = 0; j < v.size(); j++) {
   int num = check(v[j], i);//获取v[j]的i位数,对于456,1位为4,3位为6
   bucket[num].push_back(v[j]);
  }
  for (int j = 0; j < 10; j++) 
   for (int k = 0; k < bucket[j].size(); k++)
    temp.push_back(bucket[j][k]);
  for (int i = 0; i < n; i++)
   v[i] = temp[i];
 } 
}
#include<iostream>
#include<algorithm>
using namespace std;
typedef node tree;
struct node
{
 int data;
 tree left;
 tree right;
};
int main() {
 tree head;
 quick_sort(head, NULL);//[)
 head = merge_sort(head);
}
void quick_sort(tree left, tree right) {//链表的快排
 tree slow = left;
 tree fast = left;
 int temp = left->data;
 while (fast != right) {
  if (fast->data <= temp) {
   slow = slow->next;
   swap(fast->data, slow->data);
  }
  fast = fast->data;
 }
 quick_sort(left, slow->next);
 quick_sort(slow->next, right);
}
tree merge_sort(tree head) {//链表的归并算法
 if (head)return NULL;
 tree slow = head;
 tree fast = head;
 while (fast && fast->next) {
  slow = slow->next;
  fast = fast->next->next;
 }
 tree temp = slow->next;
 slow->next = NULL;//分化为两个链表然后拼接起来
 tree left = merge_sort(left);
 tree right = merge_sort(temp);
 tree head = build(left, right);
}
tree build(tree left, tree right) {
 if (!left)return right;
 if (!right)return left;
 if (left->data < right->data) {
  left->next = build(left->next, right);
  return left;
 }else {
  right->next = build(left, right->next);
  return right;
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值