对任意n个关键字排序的比较次数至少为log2(n!).
1、对任意的7个关键字进行基于比较的排序,至少要进行13次关键字之间的两两比较。
一、直接插入排序
基本思想
每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止。直接插入排序的时间复杂度为O(n^2);空间复杂度为O(1).
代码实现
class SortTest
{
public static void main(String[] args)
{
int arr[]={8,6,2,3,7,4};
sop(arr);
insert_Sort(arr);
}
public static void insert_Sort(int arr[])
{
for(int i=1;i<arr.length;i++)
{
int j = i-1;
int key = arr[i]; //哨兵用来记住待插入的元素
while(j>=0&&arr[j]>key)//判断条件
{
arr[j+1]=arr[j];
j--;
}
arr[j+1]=key;
sop(arr);
}
}
public static void sop(int arr[])
{
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
System.out.println(" ");
}
}
结果:
8 6 2 3 7 4
6 8 2 3 7 4
2 6 8 3 7 4
2 3 6 8 7 4
2 3 6 7 8 4
2 3 4 6 7 8
二、折半插入排序
基本思想
1、在直接插入排序中,通过二分查找来查找待插入的位置pos
2、将pos+1到 i-1这些元素往后移动一个位置
3、将待排序的元素复制到pos
代码实现
class Search1
{
public static void main(String[] args)
{
int arr[]={8,5,3,5,6,7};
sop(arr);
binary_insert_sort(arr);
sop(arr);
}
public static void binary_insert_sort(int arr[])
{
int i,j,key;
for( i=1;i<arr.length;i++)
{
key = arr[i];
int low = 0;
int high = i-1;
while(low<=high)
{
int mid = (low+high)/2;
if(key>arr[mid])
low = mid+1;
else
high =mid-1;
}
for(j=i-1;j>high;j--)
{
arr[j+1]=arr[j];
}
arr[j+1]=key;
}
}
public static void sop(int arr[])
{
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
System.out.print("\n");
}
}
结果:
8 5 3 5 6 7
3 5 5 6 7 8
我们看其实折半插入排序的时间复杂度为O(n^2),折半插入排序仅仅是减少了比较元素的次数,约为O(nlog2n),该比较次数于待排序的初始状态无关,仅取决于表中的元素个数n;
时间: 2024-10-24 20:02:02