您的位置:首页 > 理论基础 > 数据结构算法

数据结构——排序相关问题

2016-05-08 16:17 375 查看
对任意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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: