好久没有发过文章了,今天来发一篇。
你看着我这个看起来很正经的题目,其实不然,这是我自己发明的一种 非常好用 的排序方法。
它的时间复杂度在 O(n) 和 O(∞) 之间,主要看运气...
我之前写过一篇关于排序的文章,当时就提到了这个排序方法,
当时我的思路是随机下标,遍历数组把 a[i] 位置改成 a [随机数] 位置上的数,还要给下标去重...最后,程序不出意料地爆了99+个错。。。
直到今天,我突然想起来,并有了一种更完美的思路:
1. 先写一个 IsUp 函数,用来判断数组是不是升序(因为我要升序排序)
- bool IsUp(int w[]){
- for(int i=0;i
-1;i++){ - if(w[i+1]
return false; - }
- return true;
- }
参数是一个数组,然后遍历它,注意只遍历到 n-1 ,因为我要判断后面的元素如果小于前面的元素,就 return false,如果循环到n,访问下标是 i+1 的元素时会报错。
2.我们可以打乱数组!再写一个打乱数组的函数。
- void random(int a[],int n){
- int index,tmp,i;
- srand(time(NULL));
- for(i=0;i
- index=rand()%(n-i)+i;
- if (index != i){
- tmp = a[i];
- a[i] = a[index];
- a[index] = tmp;
- }
- }
- }
随机下标,如果和当前位置的下标不一样即可。
3.最后主程序一个死循环,随机到为升序为止。
全部代码
- #include
- #include
- #include
- #include
- using namespace std;
- int n,a[10010];
- bool IsUp(int w[]){
- for(int i=0;i
-1;i++){ - if(w[i+1]
return false; - }
- return true;
- }
- void random(int a[],int n){
- int index,tmp,i;
- srand(time(NULL));
- for(i=0;i
- index=rand()%(n-i)+i;
- if (index != i){
- tmp = a[i];
- a[i] = a[index];
- a[index] = tmp;
- }
- }
- }
- int main(){
- cout<<"输入要排序数的数量:";cin>>n;
- cout<<"输入每个数:";
- for(int i=0;i
>a[i]; - cout<<"正在排序..."<
- while(1){
- random(a,n);
- if(IsUp(a)){
- for(int i=0;i
' '; - break;
- }
- }
- return 0;
- }
-
相关阅读:
ES6:数值的扩展
MySQL高级SQL语句
大数据组件-Flume集群环境搭建
在linux上把配置命令写出来
从线代角度图解:通解、特解、非齐次通解、非齐次特解、齐次通解、齐次特解
python+django+vue图书馆选座系统pycharm源码lw
【Spring MVC】MVC如何浏览器请求(service方法)
【QCustomPlot】使用方法(源码方式)
Java数据结构-HashMap和HashSet
ChinaSkills技能大赛网络系统管理Debian模块||客户端OutsideCli和InsideCli工作任务
-
原文地址:https://blog.csdn.net/m0_64036070/article/details/126443112