好久没有发过文章了,今天来发一篇。
你看着我这个看起来很正经的题目,其实不然,这是我自己发明的一种 非常好用 的排序方法。
它的时间复杂度在 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;
- }
-
相关阅读:
semaphere部署,配置ldap
【学习笔记】正则表达式及其在VS Code,Word中查找替换的应用
webp格式如何转换成jpg?
Avalon总线协议汇总
笨方法学Python
Spring Boot业务系统如何实现海量数据高效实时搜索
VirtualApp系统升级适配方法论(1)——一切从源码来
Leetcode.2594 修车的最少时间
如何做一场高质量故障复盘
java-多态
-
原文地址:https://blog.csdn.net/m0_64036070/article/details/126443112