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

来源:互联网 发布:西门子plc tcp端口号 编辑:程序博客网 时间:2024/06/13 23:54

对任意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;

0 0