各种排序算法的分析及java实现

本文详细介绍了内排序的概念及几种主要的排序算法:直接插入排序、二分插入排序、希尔排序、选择排序(包括堆排序)、交换排序(如冒泡排序、快速排序)以及归并排序和基数排序。重点分析了直接插入排序与二分插入排序的实现原理、代码示例及时间复杂度。此外,还讨论了内排序算法在实际应用中的性能考量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://www.cnblogs.com/liuling/p/2013-7-24-01.html

  排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。

  内排序有可以分为以下几类:

  (1)、插入排序:直接插入排序、二分法插入排序、希尔排序。

  (2)、选择排序:简单选择排序、堆排序。

  (3)、交换排序:冒泡排序、快速排序。

  (4)、归并排序

  (5)、基数排序

一、插入排序
•思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止。
•关键问题:在前面已经排好序的序列中找到合适的插入位置。
•方法:
–直接插入排序
–二分插入排序
–希尔排序

①直接插入排序(从后向前找到合适位置后插入)

  1、基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。

  2、实例

  3、java实现

[java] view plaincopy在CODE上查看代码片派生到我的代码片

package com.sort;  

public class 直接插入排序 {  

    public static void main(String[] args) {  
        int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1};  
        System.out.println("排序之前:");  
        for (int i = 0; i < a.length; i++) {  
            System.out.print(a[i]+" ");  
        }  
        //直接插入排序  
        for (int i = 1; i < a.length; i++) {  
            //待插入元素  
            int temp = a[i];  
            int j;  
            /*for (j = i-1; j>=0 && a[j]>temp; j--) { 
                //将大于temp的往后移动一位 
                a[j+1] = a[j]; 
            }*/  
            for (j = i-1; j>=0; j--) {  
                //将大于temp的往后移动一位  
                if(a[j]>temp){  
                    a[j+1] = a[j];  
                }else{  
                    break;  
                }  
            }  
            a[j+1] = temp;  
        }  
        System.out.println();  
        System.out.println("排序之后:");  
        for (int i = 0; i < a.length; i++) {  
            System.out.print(a[i]+" ");  
        }  
    }  

}  

  4、分析

  直接插入排序是稳定的排序。关于各种算法的稳定性分析可以参考http://www.cnblogs.com/Braveliu/archive/2013/01/15/2861201.html

  文件初态不同时,直接插入排序所耗费的时间有很大差异。若文件初态为正序,则每个待插入的记录只需要比较一次就能够找到合适的位置插入,故算法的时间复杂度为O(n),这时最好的情况。若初态为反序,则第i个待插入记录需要比较i+1次才能找到合适位置插入,故时间复杂度为O(n2),这时最坏的情况。

  直接插入排序的平均时间复杂度为O(n2)。

②二分法插入排序(按二分法找到合适位置插入)

  1、基本思想:二分法插入排序的思想和直接插入一样,只是找合适的插入位置的方式不同,这里是按二分法找到合适的位置,可以减少比较的次数。

  2、实例

  3、java实现

package com.sort
    public class 二分插入排序 {  
        public static void main(String[] args) {  
            int[] a={49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};  
            System.out.println("排序之前:");  
            for (int i = 0; i < a.length; i++) {  
                System.out.print(a[i]+" ");  
            }  
            //二分插入排序  
            sort(a);  
            System.out.println();  
            System.out.println("排序之后:");  
            for (int i = 0; i < a.length; i++) {  
                System.out.print(a[i]+" ");  
            }  
        }  

        private static void sort(int[] a) {  
            for (int i = 0; i < a.length; i++) {  
                int temp = a[i];  
                int left = 0;  
                int right = i-1;  
                int mid = 0;  
                while(left<=right){  
                    mid = (left+right)/2;  
                    if(temp<a[mid]){  
                        right = mid-1;  
                    }else{  
                        left = mid+1;  
                    }  
                }  
                for (int j = i-1; j >= left; j--) {  
                    a[j+1] = a[j];  
                }  
                if(left != i){  
                    a[left] = temp;  
                }  
            }  
        }  
    }  

  4、分析

  当然,二分法插入排序也是稳定的。

  二分插入排序的比较次数与待排序记录的初始状态无关,仅依赖于记录的个数。当n较大时,比直接插入排序的最大比较次数少得多。但大于直接插入排序的最小比较次数。算法的移动次数与直接插入排序算法的相同,最坏的情况为n2/2,最好的情况为n,平均移动次数为O(n2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值