• 算法学习之一,排序算法


    Java排序算法的框架

     1 public class Sort01 {
     2     public static void sort(Comparable[] a){
     3         //排序算法
     4     }
     5     public static boolean less(Comparable v,Comparable w){
     6         return v.compareTo(w)<0;
     7     }
     8     public static void exch(Comparable[] a,int i,int j){
     9         Comparable t=a[i];
    10         a[i]=a[j];
    11         a[j]=t;
    12     }
    13     public static void show(Comparable[] a){
    14         for(int i=0;i<a.length;i++){
    15             System.out.print(a[i]+" ");
    16         }
    17         System.out.println();
    18     }
    19     public static boolean isSorted(Comparable[] a){
    20         for(int i=1;i<a.length;i++)
    21             if(less(a[i],a[i-1]))   return false;
    22         return true;
    23     }
    24 
    25     public static void main(String[] args){
    26         Scanner scanner=new Scanner(System.in);
    27         Comparable[] number=new Comparable[10];
    28         for(int i=0;i<10;i++){
    29             number[i]=scanner.nextInt();
    30         }
    31         sort(number);
    32        // assert isSorted(number);
    33         show(number);
    34 
    35 
    36     }
    37 }

    一 选择排序:

    选择排序就是选择最小的值放在最头的元素

    举例说就是:

    3 5 6 2 1

    第一趟:1 3 5 6 2

    第二趟:1 2 5 6 3

    第三趟:1 2 3 6 5

    第四趟:1 2 3 5 6

    算法实现:

    1 public static void sort(Comparable[] a){
    2     for(int i=0;i<a.lenth;i++){
    3         int min=i;
    4         for(int j=i+1;j<a.lenth;j++){
    5             if(less(a[j],a[min]))    min=j;
    6         }
    7         exch(a,i,min);
    8 }

    输入样例:

    3 5 6 2 1

    输出样例:

    1 2 3 5 6

    二 插入排序

    插入排序就是选择一个点,如果后面的那个点小于之前的点就交换,当之前的点小于这个点的时候,则选择下一个点,如果是这个序列本来就是顺序的,那么这个排序的复杂度就是线性介,也就是O(n)

    实现

    1 poublic static void sort(Comparable[] a){
    2     for(int i=1;i<a.lenth;i++){
    3         for(int j=i;j>0&&less(a[j],a[j-1],j--){
    4             exch(a,j,j-1);
    5         }
    6     }
    7 }

    插入排序从代码上看比选择排序简单很多而且时间复杂度比选择排序更好一些

    基本步骤是将第一个元素作为标志位,然后开始第二个元素比较,之后第二个元素作为标志位,再次比较之前的,当且仅当元素顺序一致的时候,不用执行第二个嵌套的循环,这个 时候的时间复杂度位线性介。

    基本顺序大概是这样的:

    11 15 41 23 10 4 14 8 74 47

    第一趟:11 15 41 23 10 4 14 8 74 47
    第二趟:11 15 41 23 10 4 14 8 74 47
    第三趟:11 15 23 41 10 4 14 8 74 47
    第四趟:10 11 15 23 41 4 14 8 74 47
    第五趟:4 10 11 15 23 41 14 8 74 47
    第六趟:4 10 11 14 15 23 41 8 74 47
    第七趟:4 8 10 11 14 15 23 41 74 47
    第八趟:4 8 10 11 14 15 23 41 74 47
    第九趟:4 8 10 11 14 15 23 41 47 74
    第十趟:4 8 10 11 14 15 23 41 47 74

    以上排序结果都是程序输出的,我们发现前三次结果没有什么变化因为前三次是顺序的,所以第二个循环就没有执行。

    三 希尔排序

    希尔排序就是选择一定间隔的元素比较大小,将h个数组独立排序

    希尔排序的实现:

     1 public static void ShellSort(Comparable[] a){
     2     int h=1;
     3     while(h<a.length/3)    h=3*h+1;
     4     while(h>=1){
     5         for(int i=h;i<a.length;i++){
     6             for(int j=i;j>=h&&less(a[j],a[j-h]);j-=h){
     7                 exch(a,j,j-h);
     8             }
     9         }
    10     h/=3;
    11 }

    11 15 41 23 10 4 14 8 74 47
    第1趟:10 15 41 23 11 4 14 8 74 47
    第2趟:10 4 41 23 11 15 14 8 74 47
    第3趟:10 4 14 23 11 15 41 8 74 47
    第4趟:10 4 14 8 11 15 41 23 74 47
    第5趟:4 10 14 8 11 15 41 23 74 47
    第6趟:4 10 8 14 11 15 41 23 74 47
    第7趟:4 8 10 14 11 15 41 23 74 47
    第8趟:4 8 10 11 14 15 41 23 74 47
    第9趟:4 8 10 11 14 15 23 41 74 47
    第10趟:4 8 10 11 14 15 23 41 47 74

    排序大概是这样。

    --------------------------------4月17日更新--------------------------------------------

    Python语言基本排序总结:

    冒泡排序:

    1 #冒泡排序
    2 number=[5,7,9,1,3,2,0]
    3 for k in range(1,number.__len__()):
    4     for i in range(0,number.__len__()-k):
    5         if number[i]>number[i+1]:
    6             temp=number[i]
    7             number[i]=number[i+1]
    8             number[i+1]=temp
    9 print number

    选择排序:

    #选择排序
    number=[5,7,9,1,3,2,0]
    for k in range(1,number.__len__()):
        for i in range(0,number.__len__()):
            if number[k]<number[i]:
                temp=number[i]
                number[i]=number[k]
                number[k]=temp
    print number

    快速排序:

    #快速排序
    number=[5,7,9,1,3,2,0]
    def thesort(low,high,a):
        first = low
        last = high
        if first>=last:
            return
        key = a[first]
        while first<last:
            while first<last and a[last]>=key:
                last=last-1
            a[first]=a[last]
            while first<last and a[first]<=key:
                first=first+1
            a[last]=a[first]
        a[first]=key
        thesort(low,first-1,a)
        thesort(first+1,high,a)
    thesort(0,6,number)
    print number
  • 相关阅读:
    1386. 安排电影院座位
    1123. 最深叶节点的最近公共祖先
    375. 猜数字大小 II
    未能在system.drawing中找到bitmap
    856. 括号的分数
    140. 单词拆分 II
    5909. 并行课程 III
    typora + ImgHosting (一款不会存储图片的图床实现)
    IDEA插件:search with bing、search with baidu
    多吉搜索美化
  • 原文地址:https://www.cnblogs.com/Summer7C/p/5333411.html
Copyright © 2020-2023  润新知