文档介绍:: .
>temp)
(
arr[j+incr]=arr[j];
j-=incr;
)
arr[j+incr]=temp;
}
--------------------------------------- Code---------------------------------------------
适用于排序小列表。
效率估计0 (nlog2"n) - 0 ( n " 1 .5 ) ,取决于增量值的最初大小。建议使用质数作为增量值,
因为如果增量值是2 的基,则在下一个通道中会再次比较相同的元素。
壳 (S h e ll)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元
素可能会前后跳跃。
五、归并排序
------------------------------------------------C o d e 从小至IJ大排序-------------------------
void MergeSort(int low,int high)
(
if(low>=high) return;〃每个子列表中剩下一个元素时停止
else int mid=(low+high)/2;/*将列表划分成相等的两个子列表,若有奇数个元素,则在左边子列
表大于右侧子列表*/
MergeSort(low,mid); 〃子列表进一步划分
MergeSort(mid+l,high);
int [] B =new int [high-low+1];〃新建一个数组,用于存放归并的元素
for(int i=low,j=mid+l,k=low;i<=mid && j<=high水++)/*两个子列表进行排序归并,直到两个子列
表中的一个结束*/
(
if (arr[i]<=arr[j];)
(
B [k]=arr[i];
I++;
)
else
{ B [k]=arr01; j+ + ;)
for( ;j<=high;j++,k++)〃如果第二个子列表中仍然有元素,则追加到新列表
B [k]=arr[j];
for(* =mid;i++,k++)〃如果在第一个子列表中仍然有元素,则追加到新列表中B [k]=arr[i];
for(int z=0;z<high-low+l;z++)〃将排序的数组B 的所有元素复制到原始数组a rr中
arr[z]=B [z];
------------------------------------------------------- Code-----------------------------------------------------
效 率 。 (n lo g n ),归并的最佳、平均和最糟用例效率之间没有差异。
适用于排序大列表,基于分治法。
六、快速排序
------------------------------------- Code----------------------------------------------
/*快速排序的算法思想:选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个
部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。
*/ void swap(int a,int b){int t;t =a ;a =b ;b = t;}
int Partition(int [] arr,int lowjnt high)
(
int pivot=arr[low];〃采用子序列的第一个元素作为枢纽元素
while (low < high)
(
〃从后往前栽后半部分中寻找第一个小于枢纽元素的元素
while (low < high && arr[high] >= pivot)
(
-high;
)
〃将这个比枢纽元素小的元素交换到前半部分
swap(arr[low], arr[high]);
〃从前往后在前半部分中寻找第一个大于枢纽元素的元素
while (low <high &&arr [low ]<=pivot)
(
++low;
)
swap (arr [low ],arr [high ]);〃将这个枢纽元素大的元素交换到后半部分
)
return l