通过对数据结构的学习,是我知道的算法是什么,到底有什么用途。前些日子我在看排序时,我深刻了内部排序的全过程,同时我也产生了一些自己对排序的新想法。
内部排序的全部过程都是在 内存中进行的。因此看一个排序算法的好坏,不仅要看它的时间复杂度,也要看它的空间复杂度。众所周知,按排序策略的不同可以将内部排序划分为简单排序,希尔排序,快速排序,归并排序,堆排序等。这写出的这些排序方法都是些常见而且也比较出名的算法。
但是在我看来这写算法都不不如我想出来的算法好。呵呵,希望大家见量,也许你觉得我说的有点夸张了,不过如果你理会了我的想法之后也许就不会这磨想了,好了废话少说直接入题吧。
我的基本思想是:将整个待排序序列,两两比较进行排序,然后进行错位比较排序,以达到整个序列有序的目的。
也许你感觉这段文字不好理解,不要紧看看下面的图解,你就会明白的
下面是将其排为一个递增序列:
待排序序列 | 6 | 5 | 1 | 3 | 8 | 0 |
(1) | 5 | 6 | 1 | 3 | 0 | 8 |
{2} | 5 | 1 | 6 | 0 | 3 | 8 |
(3)` | 1 | 5 | 0 | 6 | 3 | 8 |
(4) | 1 | 0 | 5 | 3 | 6 | 8 |
(5) | 0 | 1 | 3 | 5 | 6 | 8 |
红色的数字是开始交换的首数字,这样就成为了有序序列
下面我们来看看它与其它排序方法进行比较:
名称 | 时间复杂度 | 空间复杂度 |
简单排序 | O(N2) | O(1) |
希尔排序 | O(NlogN) | O(1) |
归并排序 | O(Nlog N) | O(N) |
快速排序 | O(N ) | O(N) |
堆排序 | O(Nlog N) | O(1) |
我的排序方法 | O(Nlog N) | O(1) |
算法实现:
do{
flag[1]=0;
t=t%2; //为了实现错位
for(int i=t;i<10;i=i+2)
if(a[i]>a[i+1])
{ int temp;
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
flag[1]=1;//用于设置标志
}
t++;
flag[2]=flag[1];
}while(flag[1]!=0||flag[2]!=0);
如果感觉这个比较复杂请看看下面的分解算法:
do{
flag1=0;
flag2=0;
for(int i=0;i<10;i=i+2)
if(a[i]>a[i+1])
{ int temp;
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
flag1=1;
}
if(a[0]>a[9])
{ int temp;
temp=a[0];
a[0]=a[9];
a[0]=temp;
flag1=1;
}
for(int j=1;j<10;j=j+2)
if(a[j]>a[j+1])
{ int temp;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag1=1;
}
}while(flag1!=0||flag2!=0);
好了,请大家给给意见。