今天在网上上了算法设计课,学了算法的时间复杂度分析和分治思想,受老师课上一道题目启发,自己找到了排序算法的新算法,时间复杂度为O(nlogn),无论好坏情况都是这个量级,有兴趣的朋友可以看一看,探索更多的算法。
#include <iostream>
using namespace std;
void find_min(int s[],int l,int r);
void special_sort(int s[],int l,int r);
int main(){
int s[]={34,4,54,6,343,900,-34,54,343532,-3453};
int n=0;
for(int &e:s){
n++;
}
special_sort(s,0,n-1);
for(int i=0;i<n;++i)cout<<s[i]<<endl;
return 0;
}
void find_min(int s[],int l,int r){
if(r-l<=2){
for(int i=r;i>l;i--){
if(s[i]<s[i-1]){
swap(s[i],s[i-1]);
}
}
}
else{
find_min(s,l,(l+r)/2);
find_min(s,(l+r)/2+1,r);
if(s[l]>s[(l+r)/2+1]){
swap(s[l],s[(l+r)/2+1]);
}
}
}
void special_sort(int s[],int l,int r){
for(int i=l;i<r-1;i++){
find_min(s,i,r);
}
}
思想其实很简单,先写了一个将一个数组最小值排到数组第一个位置的函数find_min(),用了分治的方法,将时间复杂度控制在O(logn),然后在排序的函数,即special_sort()中循环调用find_min()。