Sort

Sort

排序是重要的一种操作。本文主要介绍各种常用的排序算法。

包括

插入排序(直接插入。希尔排序)

交换排序(冒泡 快排)

选择排序(直接选择 堆排序)

归并排序

外部排序

1.插入排序

直接插入排序

package sort;

public class InsertionSort {
    public static void sort(int[] a){
        int n=a.length;     
        int j=0;
        for(int i=0;i<n;i++){
            int tmp=a[i];
            for(j=i;j>0 && tmp<a[j-1];j--){
                a[j]=a[j-1];
            }
            a[j]=tmp;           
        }
    }
    public static void main(String[] args) {
        int[] a={9,2,4,7,4,10,3,8};
        sort(a);
        for(int i:a){
            System.out.print(i+" ");
        }
    }
}

希尔排序

package sort;

public class ShellSort {
    public static void sort(int[] a){
        int n=a.length;
        int j;
        for(int gap=n/2;gap>0;gap/=2){
            for(int i=gap;i<a.length;i++){
                int tmp=a[i];
                for(j=i;j>=gap&&tmp<a[j-gap];j=j-gap){
                    a[j]=a[j-gap];
                }
                a[j]=tmp;
            }
        }
    }
    
    public static void main(String[] args) {
        int[] a={9,2,4,7,4,10,3,8};
        sort(a);
        for(int i:a){
            System.out.print(i+" ");
        }
    }
}

2.交换排序

冒泡排序

package sort;

public class BubbleSort {
    public static void sort(int[] a){
        int n=a.length;
        for(int i=0;i<n;i++){
            for(int j=0;j<n-1-i;j++){
                if(a[j]>a[j+1]){
                    int tmp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=tmp;
                }
            }
        }
    }
    
    public static void main(String[] args) {
        int[] a={2,4,7,4,10,3,8};
        sort(a);
        for(int i:a){
            System.out.print(i+" ");
        }
    }
}

快排

package sort;

/**
 * ����
 * @author neuly
 *
 */
public class QuickSort {
    
    public static int[] swap(int[] s, int l,int r){
        //���м�����͵�һ�������н���
        int tmp=s[l];
        s[l]=s[(r-l)/2];
        s[(r-l)/2]=tmp;
        return s;
    }
    
    public static void quickSort(int[] s, int l,int r){
        if(l<r){    
            int i=l,j=r,x=s[l];
            while(i<j){
                while(i<j&&s[j]>=x) j--;
                if(i<j) s[i++]=s[j];
                
                while(i<j&&s[i]<=x) i++;
                if(i<j) s[j--]=s[i];
            }
            s[i]=x;
            quickSort(s, l, i-1);
            quickSort(s, i+1, r);
        }
    }
    
    public static void sort(int[] a){
        quickSort(a, 0, a.length-1);
    }
    public static void main(String[] args) {
        int[] a={2,4,7,4,10,3,8};
        sort(a);
        for(int i:a){
            System.out.print(i+" ");
        }
    }
}

3.选择排序

堆排序

package sort;

public class HeapSort {
    private static int leftchild(int i){
        return 2*i+1;
    }
    
    private static void percDown(int[] a, int i,int n){
        int child;
        int tmp;
        for(tmp=a[i];leftchild(i)<n;i=child){
            child=leftchild(i);
            if(child!=n-1&&a[child]<a[child+1]){
                child++;
            }
            if(tmp<a[child]){
                a[i]=a[child];
            }else{
                break;
            }
        }
        a[i]=tmp;
    }
    
    public static void sort(int[] a){
        //建立堆
        for(int i=a.length/2;i>=0;i--){
            percDown(a, i, a.length);
        }
        //堆排序
        for(int i=a.length-1;i>0;i--){
            int temp = a[i];
            a[i] = a[0];
            a[0] = temp;
            percDown(a, 0, i);
        }
    }
    public void print(int[] list,int begin,int end){
        for(int i=0;i<begin;i++) System.out.print("\t");
        for(int i=begin;i<=end;i++) System.out.print(list[i] + "\t");
        System.out.println();
    }
     public static void main(String[] args) {
            // ��ʼ��һ������
            int[] array = {
                    1, 3, 4, 5, 2, 6, 9, 7, 8, 0
            };
     
            // ���ÿ������򷽷�
            HeapSort heap = new HeapSort();
            System.out.print("����ǰ:\t");
            heap.print(array, 0, array.length - 1);
            heap.sort(array);
            System.out.print("�����:\t");
            heap.print(array, 0, array.length - 1);
        }
    
}

4.归并排序

思路:

将数组氛围left right两部分 分别排序,再merge。

package sort;

import java.util.Arrays;

public class MergeSort {
    private static void sort(int[]a,int[]tmpArray, int left,int right){
    if(left<right){
        int mid=(left+right)/2;
        sort(a,tmpArray,left, mid);
        sort(a,tmpArray, mid+1, right);
        merge(a,tmpArray,left,mid+1,right);
    }
}
private static void merge(int[]a,int[]tmpArray,int leftPos,int rightPos,int rightEnd){
    int numElements=rightEnd-leftPos+1; 
    int leftEnd=rightPos-1;
    int tmpPos=leftPos;
    
    while(leftPos<=leftEnd&&rightPos<=rightEnd){
        if(a[leftPos]<a[rightPos]){
            tmpArray[tmpPos++]=a[leftPos++];
        }else{
            tmpArray[tmpPos++]=a[rightPos++];
        }
    }
    while(leftPos<=leftEnd) tmpArray[tmpPos++]=a[leftPos++];
    while(rightPos<=rightEnd) tmpArray[tmpPos++]=a[rightPos++];
    
    for(int i=0;i<numElements;i++,rightEnd--){
        a[rightEnd]=tmpArray[rightEnd];
    }
}

public static void mergeSort(int[] a){
    int[] tmpArray= new int[a.length];
    sort(a,tmpArray, 0, a.length-1);
    
}
public static void main(String[] args) {
     // ��ʼ��һ������
    int[] array = {
            1, 3, 4, 5, 2, 6, 9, 7, 8, 0
    };

    mergeSort(array);
    System.out.println(Arrays.toString(array));
    
    
}
}

5.外部排序

排序方法。

二路归并

总结

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • 排序算法 定义 对一序列对象根据某个关键字进行排序 评判标准 稳定:如果a原本在b前面,而a=b,排序之后a仍然在...
    exialym阅读 507评论 1 3
  • 排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查...
    Cryptic阅读 6,182评论 0 36
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,164评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,727评论 0 15
  • 5月14日,今天是母亲节。很羞愧的,却没有为母亲做点什么,早上象征性的打了个电话问候一声,母亲依然感动的连连说不用...
    清水无香LY阅读 7,714评论 2 3