当前位置: 首页 > wzjs >正文

衡水移动端网站建设360推广登陆

衡水移动端网站建设,360推广登陆,h5怎么制作进入下一页,seo综合查询怎么回事#学习自用# 排序算法 冒泡排序优化 冒泡排序的本质是相邻两个元素比较大小,并交换顺序,完成一趟排序,可以把最大或者最小的数字放在序列的末尾,再进行下一趟的排序,一直进行到最后只剩两个元素进行比较。这其中可能…

#学习自用#

排序算法

冒泡排序优化

冒泡排序的本质是相邻两个元素比较大小,并交换顺序,完成一趟排序,可以把最大或者最小的数字放在序列的末尾,再进行下一趟的排序,一直进行到最后只剩两个元素进行比较。这其中可能会出现并不需要执行这么多次的情况,传统的冒泡一直会执行到最后一趟,执行了不必要的比较。

void BubbleSort(int* a, int n)
{for (int j = n - 1; j >0 ; j--){bool flag = true;for (int i = 0; i < j; i++){if (a[i] > a[i + 1]){swap(a[i], a[i + 1]);flag = false;}}if (flag)break;}for (int i = 0; i < n; i++){cout << a[i]<<' ';}
}

核心就是判断这一趟的排序中是否发生了位置交换,如果有那么说明排序后的数列可能还是无序的,如果没有交换,那么数列就已经是有序的了,无需再进行比较。

选择排序

选择排序的思想是,默认第一个数为最小值(也可以是最大,取决于你想升序还是降序排),再遍历之后的元素,去找比默认最小还要小的数,将其设置为最小数,完成第一次变量后再交换位置。第一个数排好后就用同样的方法排第二个数。与冒泡的区别是,选择排序最多调用元素个数-1次swab。

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

 插入排序

插入排序的思想是将数据分为有序区和无序区,无序区的数插入有序区,以升序为例,一个元素默认有序,如果第二个元素大于它那么有序区增加一个元素,如果比它小,就执行插入,确定要插入的位置,并把插入位以及有序区之后的元素后移,完成之后有序区增加一个元素,再向后遍历。

void InsertSort(vector<int>& arr)
{for (int j = 1; j < arr.size(); j++){for (int i = 0; i < j; i++){if (arr[j] < arr[i]){swap(arr[j], arr[i]);}}}for (int i : arr)cout << i << ' ';
}

希尔排序

希尔排序是插入排序的一种,是插入的改进。设定步长,将数据进行分组然后使用插入排序,使数据出现局部有序,再缩短步长重复操作,直到设置步长为1,进行最后一次插入排序。

void ShellSort(vector<int>& arr)
{for (int step = arr.size() / 2; step > 0; step /= 2){for (int start = 0; start < step; start++)ShellInsert(arr, start, step);}for (int i : arr)cout << i << ' ';
}
void ShellInsert(vector<int>& arr, int start, int step)
{for(int j=start+step;j<arr.size();j+=step)for (int i = start; i < j; i += step){if (arr[j] < arr[i])swap(arr[j], arr[i]);}
}

计数排序

计数排序是对排序元素具有一定要求才能使用的排序,如果排序元素全部为非负整数,那么我们可以遍历需要排序的元素找到最大值,设置一个计数数组,其中数组下标代表元素的值,该下标位置所对应的元素表示这个值存在多少个同样的数,这样我们只需要把排序元素遍历,存入相应的计数数组位置即可完成排序。

void CountSort(vector<int>& arr)
{int Max = *max_element(arr.begin(), arr.end());//要添加头文件algorithm,返回最大值所在地址int* CountArr = new int[Max + 1];memset(CountArr, 0, sizeof(int) * (Max + 1));for (int i : arr)CountArr[i]++;for (int i = 0; i < Max + 1; i++){while (CountArr[i]){cout << i << ' ';CountArr[i]--;}}delete[]CountArr;
}

计数数组记得初始化,否则会出现随机数,导致while(CountArr[i])进入死循环。

堆排序

通过构建大根堆,将最大值排在第一个父节点,再将最后一个节点与第一个父节点的值交换,结尾节点-1,重新构建大根堆,循环执行,即可完成升序排序。

void BuidHeap(vector<int>& arr, int end)
{int Fnode = (end - 1) / 2;//本次排序最后一个父节点的下标for (; Fnode >= 0; Fnode--){int Lnode = Fnode * 2 + 1;//左节点下标if (Lnode == end && arr[Lnode] > arr[Fnode])swap(arr[Lnode], arr[Fnode]);else if (Lnode < end && arr[Lnode] > arr[Lnode + 1]&& arr[Lnode] > arr[Fnode])swap(arr[Lnode], arr[Fnode]);if (Lnode < end && arr[Lnode] < arr[Lnode + 1]){Lnode += 1;if(arr[Lnode] > arr[Fnode])swap(arr[Lnode], arr[Fnode]);}}swap(arr[0], arr[end]);
}
void HeapSort(vector<int>& arr)
{for (int end = arr.size() - 1; end > 0; end--)//end 为本次排序的结尾下标BuidHeap(arr, end);for (int i : arr)cout << i << ' ';}

快速排序

以第一个元素为基准,设置左端点和右端点,通过与基准比较,交换元素顺序,使左边的元素小于基准,右边的元素大于基准,使用递归实现数组升序排序。

void FastSort(vector<int>& arr, int l, int r)
{if (l >= r)return;int i = l, j = r;int temp = arr[l];//store basementwhile (i < j){while (arr[j] >= temp && i < j)j--;//这里必须限制i<j,否则j可能会减到i之后if (arr[j] < temp){arr[i] = arr[j];i++;}while (arr[i] <= temp && i < j)i++;if (arr[i] > temp){arr[j] = arr[i];j--;}}arr[i] = temp;FastSort(arr, l, i - 1);FastSort(arr, i+1, r);
}

这里运用了递归的思想,确定基准位置后, 用同样的步骤对基准左右两边进行排序,递归必须要确立一个终止条件,这里是 l>=r,l和r两个变量用于边界表示,不能改变,所以在遍历数据的时候使用了临时变量i,j

归并排序

归并排序是利用了递归的特性,在不断2分数组元素,直至每个小组元素只剩一个时,逐层退出递归并进行排序。      

void DivideMerge(vector<int>& arr, int l, int r)
{if (l == r)return;int mid = (l + r) / 2;DivideMerge(arr, l, mid );DivideMerge(arr, mid + 1, r);MergeSort(arr, l, r, mid);
}
void MergeSort(vector<int>& arr, int l, int r, int mid)
{int i = l, j = mid + 1;//分别指向合并的两个部分的开头,进行遍历int* temp = new int[r - l + 1];//用于存排好顺序后的数组,这里采用的是分别遍历比较大小,赋值给对应位置int index = 0;//临时数组下标while (i <= mid && j <= r)  {if (arr[i] < arr[j])temp[index++] = arr[i++];elsetemp[index++] = arr[j++];}	while(i <= mid)temp[index++] = arr[i++];//保证所有的数都放入的临时数组while (j <= r)temp[index++] = arr[j++];for (int i = 0; i < index; i++)arr[l + i] = temp[i];delete[]temp;
}

  要注意,临时数组赋值给原来的数组时,原数组的下标为 l+i ,并非从 i 开始。

http://www.dtcms.com/wzjs/50774.html

相关文章:

  • 网站开发代码 免责声明宁波seo外包代运营
  • dedecms网站建设合同十大互联网平台
  • 国内做会展比较好的公司推送者seo
  • uniapp做网站陕西网站建设制作
  • 南通宏仁建设工程有限公司招聘网站app推广软件有哪些
  • 长春建网站一般要多少钱企业网站优化服务公司
  • 网站找百度做可以嘛互联网舆情信息
  • 做哪些网站可以赚钱的成功的品牌推广案例分析
  • 济南网站建设索q479185700seo网站
  • 新闻网站 内容建设广告联盟平台
  • 怎么做外语网站安徽网络seo
  • 宁波建站模板源码百度推广怎么收费
  • 深圳罗湖网站建设如何创建个人网页
  • 投资厦门seo测试
  • 大学生ppt免费模板网站百度云下载
  • 西宁做网站建设公司b2b电商平台有哪些
  • 上海专业高端网站建设服今日国际重大新闻
  • 挂机宝如何做网站百度浏览器官网在线使用
  • 房地产类的网站建设产品推广计划方案
  • 企业网站模板源码免费免费发布推广信息网站
  • php对比java做网站营销渠道有哪几种
  • 长沙本土网站制作公司营销软文范例大全
  • 鄂州市城市建设档案馆网站武汉网络推广优化
  • 网站建设行业 知乎视频号下载器手机版
  • 莘县建设局网站中山排名推广
  • 互联网网站如何做流量统计排名前50名免费的网站
  • 网站怎么做域名跳转品牌运营策略有哪些
  • 建设网站的会计分录百度免费咨询
  • 杭州仪器网站制作线上营销培训
  • 怎么自己设计网站百度贴吧官网app下载