首页 > 其他分享 >排序

排序

时间:2024-07-20 21:29:41浏览次数:9  
标签:int ++ vector vec mySort 排序 size

define _CRT_SECURE_NO_WARNINGS 1

include"mySort.h"

void mySort::printArr(vector& vec) {
for (const auto& i : vec) {
cout << i<<" ";
}

}

void mySort::BubbleSort(vector &vec) {
for (int j = vec.size() - 1; j >= 1; j--) {
bool flag = true;
for (int i = 0; i < j; i++) {
if (vec[i] > vec[i + 1]) {
swap(vec[i], vec[i + 1]);
flag = false;
}
}
if (flag) break;
}
}

void mySort::SelectSort(vector& vec) {
for(int i=0;i<vec.size()-1;i++)
for (int j = i + 1; j < vec.size(); j++) {
if (vec[i]>vec[j]) {
swap(vec[j], vec[i]);
}
}

}

void mySort::InsertSort(vector& vec) {
for (int j = 1; j < vec.size(); j++) {
for (int i = 0; i < j; i++) {
if (vec[j] < vec[i]) {
int tmp = vec[j];
for (int k = j - 1; k >= i; k--) {
vec[k + 1] = vec[k];
}
vec[i] = tmp;
break;
}
}
}
}
void mySort::ShellInsert(vector& vec, int start, int gap) {
for (int j = start+gap; j < vec.size(); j+=gap) {
for (int i = start; i < j; i+=gap) {
if (vec[j] < vec[i]) {
int tmp = vec[j];
for (int k = j - gap; k >= i; k-=gap) {
vec[k + gap] = vec[k];
}
vec[i] = tmp;
break;
}
}
}
}

void mySort::ShellSort(vector& vec) {
for (int gap = vec.size() / 2; gap >= 1; gap /= 2) {
for (int i = 0; i < gap; i++) {
ShellInsert(vec, i, gap);
}
}
}

void mySort::CountSort(vector& vec) {
//1.先找最大值
//直接用algorithm库中的函数 int max = max_element(vec.begin(), vec.end());
int max = vec[0];
for (int i = 0; i < vec.size(); i++) {
if (vec[i] > max) {
max = vec[i];
}
}
//2.根据最大值开辟数组
int
p = new int[max + 1];
memset(p, 0, sizeof(int)*(max+1));
//3.将源数据放入数组中并计数
for (int i = 0; i < vec.size(); i++) {
p[vec[i]]++;//统计vec[i]出现的次数
}
vec.clear();
//4.安照下标依次取计数数组中的元素
for (int i = 0; i < max + 1; i++) {
while (p[i]) {
vec.push_back(i);
p[i]--;
}
}
delete[] p;
}

void mySort::BucketSort(vector& vec) {
int min = *min_element(vec.begin(), vec.end());
int max = *max_element(vec.begin(), vec.end());
int bucketNum = (max - min + 1) / vec.size()+1;
vector<vector> Buckets(bucketNum);
for (int i = 0; i < vec.size(); i++) {
int index = (vec[i] - min + 1) / vec.size();
Buckets[index].push_back(vec[i]);
}
for (int i = 0; i < Buckets.size(); i++) {
sort(Buckets[i].begin(), Buckets[i].end());
}
vec.clear();
for (int i = 0; i < Buckets.size(); i++) {
for (int j = 0; j < Buckets[i].size();j++) {
vec.push_back(Buckets[i][j]);
}
}
}

void mySort::Build_max_heap(vector& vec, int start, int end) {
int cur = start;//从当前节点开始构建大根堆
int l = 2 * cur + 1;//左孩子
for (; l <= end;cur=l,l=2*cur+1) {
if (l<end && vec[l] < vec[l + 1])l++;//l左右孩子里最大的
if (vec[l] >vec[cur]) swap(vec[l], vec[cur]);
else break;
}
}

void mySort::HeapSort(vector& vec) {
for (int i = vec.size() / 2 - 1; i >= 0; i--) {
Build_max_heap(vec, i, vec.size() - 1);
}
for (int i = vec.size() - 1; i > 0; i--) {
swap(vec[0], vec[i]);
Build_max_heap(vec, 0, i-1);
}
}

void mySort::QuickSort(vector& vec, int l, int r) {
if (l >= r) return;
//默认最左侧位基准
int tmp = vec[l];
int i = l, j = r;
while (i < j) {
while (i<j && vec[j] > tmp)j--;//j--后i=j就不用执行下部了
if (i < j) {
vec[i++] = vec[j];
}
while (i < j && vec[i] < tmp) i++;
if (i < j) vec[j--] = vec[i];
}
vec[i] = tmp;
QuickSort(vec, l, i - 1);
QuickSort(vec, i + 1, r);
}

void mySort::Merge_up2down(vector& vec, int l, int r) {
if (l >= r) return;
int mid = (l + r) / 2;
Merge_up2down(vec, l, mid);
Merge_up2down(vec, mid + 1, r);
MergeSort(vec, l, mid, r);
}

void mySort::MergeSort(vector& vec, int l, int mid, int r) {
int* p = new int[r - l + 1];
int i = l, j = mid + 1, index = 0;
while (i <= mid && j <= r) {
if (vec[i] < vec[j]) {
p[index++] = vec[i++];
}
else p[index++] = vec[j++];
}
while (i <= mid) p[index++] = vec[i++];
while (j <= r) p[index++] = vec[j++];
for (int i = 0; i < index; i++) {
vec[l + i] = p[i];
}
delete[] p;
}

标签:int,++,vector,vec,mySort,排序,size
From: https://www.cnblogs.com/windzhao6/p/18313830

相关文章

  • 各种快速排序-史诗级巨作
    定义快速排序(英语:Quicksort),又称分区交换排序(英语:partition-exchangesort),简称「快排」,是一种被广泛运用的排序算法。基本原理与实现过程快速排序的工作原理是通过分治的方式来将一个数组排序。快速排序分为三个过程:将数列划分为两部分(要求保证相对大小关系);递归到两个子序......
  • 嵌入式学习记录——C基础(数组与排序)
    数组与排序数组一维数组二维数组排序冒泡排序选择排序数组数组是由一个或者多个相同数据类型的数据组成的一个集合一维数组如果将数组看做一个坐标轴,一维数组则如同只有X坐标,每个数组中的元素内存地址都是连续的,当数据类型和首个元素a[0]确定时,后续a[i]依次递增......
  • Python中用来排序的方法sort、sorted
    sort与sorted区别:sort是应用在list上的方法,而sorted可以对所有可迭代的对象(他们可以是list、dict、set、甚至是字符串)进行排序操作。list的sort方法返回的是对已经存在的列表进行操作,无返回值,而内建函数sorted方法返回的是一个新的list,而不是在原来的基础上进行......
  • 常见的排序算法——堆排序(二)
    本文记述了针对堆排序微小改动的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想堆的下沉操作中用到了昂贵的数据交换操作,此改动参考无交换的插入排序的思想,实现了减少数据交换的下沉操作。先将要下沉的元素存放在临时空间中,再将下降过程中遇......
  • 快速排序quicksort
    #include<iostream>usingnamespacestd;intpartition(inta[],intlow,inthigh){ intpivot=a[low]; while(low<high) { while(low<high&&a[high]>=pivot)//先从high开始 high--; a[low]=a[high]; while(low<high......
  • 二路归并排序
    #include<iostream>usingnamespacestd;voidmerge(inta[],intlow,intmid,inthigh){ intn1=mid-low+1; intn2=high-mid; int*L=(int*)malloc(sizeof(int)*n1); int*R=(int*)malloc(sizeof(int)*n2); inti,j,k; for(i=0,k=low......
  • 插入排序 insertsort
    #include<iostream>usingnamespacestd;voidinsertsort(inta[],intn){ inti,j,key; for(i=1;i<n;i++) { if(a[i]<a[i-1]) { key=a[i]; for(j=i-1;j>=0&&a[j]>key;j--) a[j+1]=a[j]; a[j......
  • 数据结构_排序
    目录一、排序二、插入排序2.1直接插入排序2.2希尔排序三、选择排序3.1直接选择排序3.2堆排序四、交换排序4.1冒泡排序4.2快速排序五、归并排序六、排序算法分析总结一、排序排序:就是使一串记录序列,按照其中某个或某些关键字的大小,进行递增或递减的排列......
  • 堆排序的实现
    首先需要知道的是,如果想要对一个数组排升序,要建大堆,排降序,要建小堆。具体过程:(以排降序为例)1)建小堆;2)交换堆顶(第一个)和堆尾(最后一个)的数据;3)交换完后,最后一个数据不动,剩下的数据对堆顶元素进行向下调整;4)循环2)3)步骤。下面用图来展示一下过程:1)假设对数组arr[10]={3,1......
  • 合并排序数组
    合并排序数组(蓝桥杯题库)题目描述给定排序数组A和B,实现一个算法将B按排序顺序合并到A中。介绍如下:数组A和B的均为排序数组,数字按从小到大排列。数组A的的长度为 ......