有关排序的东西还是半年前看的,很多东西都忘了。所以今天拿出来再回忆一下。。
简单的排序方法有:冒泡排序,选择排序,插入排序。
其中冒泡排序算法最差,效率最低。算法基本思路是从树组的第1个元素开始,将它与其数组的其他元素进行比较,大的放在后面,这样每论下来能选出一个最大的,这样就进行了由小到大的排序。
选择排序不同于冒泡排序的是,它是从最左边开始,也就是将数组中小的元素先进行排序,而冒泡排序是先将大的元素进行了排序。思路是从第1元素(outer)开始,一个指针(inner)从第2个元素开始向后遍历找到最小的元素(min),然后将min放到第1个元素(outer),将outer放到min的位置,也就是将这两个元素进行一次swap。下一次outer和min将移到第2个元素,inner从第3个元素开始寻找min,找到了就swap,一直这么下去。。。这样数组的左边始终是有序的。选择排序比冒泡优越的地方在于两个元素的swap将少很多。
插入排序不同于冒泡排序的是,它将数组分成了左右的有序和无序的两个部分。步骤是:先设置一个标志元素(temp),然后从最左边开始,先把第2个元素作为(outer,inner),然后比较inner-1和temp的大小,如果temp小,则将inner-1 copy到inner中,temp再copy到inner-1中。第2次,outer/inner指向第3个元素,再将outer copy到temp,再比较inner-1与temp的大小如果inner-1小,就将temp copy到inner,后面的将不再做比较了,因为在左边inner-1已经是最大的了。如果inner-1比temp大,则将inner-1放到inner,inner向左移动一格,再比较inner-1和temp的大小,如果小于temp,就将temp copy到inner中。插入排序的好处在与只有元素间的copy没有swap,而copy比swap要快的多。所以插入排序一般速度是冒泡排序的两倍,也比选择排序要快。。。。
上面的3中简单的排序算法总的来说效率都慢。。。。O(N*N)。。。
下面再来说下mergeSort。mergeSort基本原理是将一个数组不停的从中间分成两个部分,一直分到只有一个元素为止,然后在把分开的两个数组合并为一个,合并的过程中实现了数族的有序。这个用递归来实现非常的方便。
下面是一个MergeSort的例子:
public class MergeSortApp
{
public double[] theArray = {34,45,77,54};
public void recMergeSort(double[] workspace,int low,int high)
{
mid = (low+high)/2;
if(low==high)
return;
while(true)
{
recMergeSort(workspace,low,mid);
recMergeSort(workspace,mid+1,high);
Merge(workspace,low,mid+1,high);
}
}
public void Merge(double[] workspace,int lowPtr,int highPtr,int upperBound)
{
int j = 0; //theArray index
int n = upperBound-lowptr+1;
int mid = highPtr-1;
while(lowPtr<=mid&&highPtr<=upperBound)
{
if(theArray[lowPtr]<theArray[highPtr]
workspace[j++] = theArray[lowPtr++];
else
workspace[j++] = thArray[highPtr++];
}
while(lowPtr<=mid)
workspace[j++] = theArray[lowPtr++];
while(highPtr<=upperBound)
workspace[j++] = theArray[highPtr++];
for(j=0; j<n; j++)
theArray[lowerBound+j] = workSpace[j];
}
}