c++排序方法总结(持续更新)

来源:互联网 发布:激战2人类男捏脸数据库 编辑:程序博客网 时间:2024/06/06 06:51

排序是程序常用的算法,一个好的排序影响这程序执行的效率,接下来我将介绍程序中常用的几种排序方法。

(图片来自网上)

                                       一.冒泡排序法

     冒泡排序顾名思义就是像冒泡一样依次将最大(或最小)的数字置顶,然后得到正确的排序。冒泡排序的时间复杂度也比较高,达到O(n^2),每次遍历无序区间都将优先级高的元素移动到无序区间的末尾。冒泡排序是一种稳定的排序方式


template<typename T>void bubbleSort(T &x)//冒泡排序法{int t,count;count = sizeof(x) / sizeof(x[0]);//计算数组的大小bool swapped = false;for (int i = 0; i < count-1; i++)//减1是因为最后一次不需要排序{for (int j = 0; j < count - i-1; j++){if (x[j] < x[j + 1])//将当前数字与后一位相比较若小于于则交换位置{t = x[j + 1];x[j + 1] = x[j];x[j] = t;}swapped = true;}if (swapped == false)//当排序正确时退出循坏return;}}

二.按名次排序

              名次排序法先将数组中所有数字的名次计算出来,再利用一个中间数组存放排序后再放回,适合小程序的排序计算。

template<typename T>void rearrange(T &x){const int count= sizeof(x) / sizeof(x[0]);//计算数组的大小int t,*u;int r[count] = { 0 };//定义并初始化计数数组for (int i = 0; i < count; i++){t = x[i];for (int j = 0; j < count; j++)if (x[j] < t)r[i]++;//算出每个数在数组中的名次并存在计数数组中}//当r[i]!=i时,说明排序位置不对,因此交换for(int i=0;i<count;i++)while (r[i] != i){t = r[i];swap(x[i], x[t]);swap(r[i], r[t]);}}



             三.选择排序法

             选择排序法,先找到最小(最大)的数字然后将其移到第一个位置,再将余下的数字依次放在对应的位置,依次类推直至排序完成。


template<typename T>void selectionSort(T &x){int indexOfMin,count,t;count = sizeof(x) / sizeof(x[0]);//计算数组大小for (int i = 0; i < count; i++){indexOfMin = i;//算出每一轮的最小值for (int j = i; j < count; j++)if ((x[indexOfMin] >= x[j]) && (indexOfMin != j))indexOfMin = j;//将得到的最小值一次放在相应位置t = x[i];x[i] = x[indexOfMin];x[indexOfMin] = t;}}
阅读全文
0 0