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

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

数据结构——排序相关问题的相关文章

数据结构--排序

插入排序(上)     基本思想:每次将一个待排序的的元素,按其关键字大小插入到已经排好序的子表的适当位置,直到全部元素插完为止.直接插入排序    简写排序思路:     假设待排序的元素存放在R[0.....n-1]中,在排序过程中,将R划分为两个区间,分别为R[0.....i-1]和R[i....n-1](刚开始时i=1,有序区只有R[0]一个元素),    其中,前一个子区间即是一个已经排好序的子区间,即有序区,后一个子区间则是一个待排序的无序区.   直接插入排序的操作即是:将当前无序

黑马程序员——数据结构排序算法总结

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 下面是几个网上常见的总结图: 有些不同之处:集中在希尔排序的时间复杂度.快速归并的空间复杂度上 个人总结口诀: 选择N方-->选择排序的最好最坏平均都N方 插入冒泡最好N-->插入冒泡的最好是N,其他是N方 归并堆n乘logN-->归并希尔堆的最好最坏平均都是n乘logN 快速最坏N方-->快速排序的最坏是N方,其他是n乘logN 快速选择希尔堆不稳定-->

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

TERSUS画画一样开发软件 集合类元件介绍-对象排序相关元件

TERSUS无代码手机电脑管理类软件开发,其中对象排序相关元件包括:数字序列(Range)元件.排序(Sort)元件.去重(Unique Items)元件 数字序列(Range)元件:是创建一个包含指定范围的数组,创建出一个整数列表,和有代码开发一样,一般是用在循环中的,比如需要重复运算15次,就用这个来创建15个数字序列: 排序(Sort)元件:是将对象进行排序的一个元件,可以指定排序的依据,是按对象中哪一个字段或名称的对象进行处理: 去重(Unique Items)元件:是将一组对象中的重复

20175314薛勐 数据结构-排序(选做)

数据结构-排序(选做) 要求 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己和学

数据结构-排序(选做) 20175204

数据结构-排序(选做) 任务要求 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己

NGINX----源码阅读---数据结构---配置文件相关

1 typedef struct { 2 ngx_file_t file; 3 ngx_buf_t *buffer; 4 ngx_buf_t *dump; 5 ngx_uint_t line; 6 } ngx_conf_file_t; core/ngx_conf_file.h buffer:配置文件缓存,在配置文件解析时提供缓存作用. dump: line:当前配置文件解析的行数 file:配置文件的相关信息: core/ngx_file.h struct ngx_file_s { //ngin

数据结构——排序算法总结

排序(Sorting)就是将一组对象依照规定的次序又一次排列的过程,排序往往是为检索而服务的.它是数据处理中一种非常重要也非经常常使用的运算.比如我们日常学习中的查字典或者书籍的文件夹.这些都事先为我们排好序,因此大大减少了我们的检索时间,提高工作效率. 排序可分为两大类: 内部排序(Internal Sorting):待排序的记录所有存放在计算机内存中进行的排序过程: 外部排序(External Sorting):待排序的记录数量非常大,内存不能存储所有记录.须要对外存进行訪问的排序过程. 外

Python中对复杂数据结构排序(类似C中结构体数据结构)

Python中排序主要有两个函数:sorted和列表成员函数sort,两者除了调用方式有些区别外,最显著的区别是sorted会新建一个排序好的列表并返回,而sort是修改原列表并排好序.sorted的原型是: sorted(iterable, cmp=None, key=None, reverse=False) sort的原型是: list.sort(cmp=None, key=None, reverse=False) 其中cmp和key都是函数引用,即可以传入函数名.这两个函数都是对list里