02-02 算法-数组排序(持续更新)

资料来源:
https://blog.csdn.net/yushiyi6453/article/details/76407640
https://www.cnblogs.com/suiyue-/p/6561051.html
https://www.cnblogs.com/developerY/p/3166462.html

gitHub 相关源码路径:
https://github.com/mackzheng/BriefBook/blob/master/Arithmetic/src/main/java/com/avl/arithmetic/Sort/ArraySort.java

排序分为内排序和外排序。
内排序:
1.插入排序:直接插入排序,折半插入排序,希尔排序。
2.选择排序:简单选择排序,堆排序。
3.交换排序:冒泡排序,快速排序。
4.归并排序
5.桶排序:基数排序,计数排序

外排序
6.多路归并
7.败者树

稳定性:
能够保证相同数据的前后位置不发生变化。

稳 定:冒插归计基
不稳定:选快堆希

时间复杂度:
O(n^2) 冒选插
O(nlogn) 归快堆希
O(n+k) 计数
O(N*M) 基数

image.png

==========================
1.冒泡排序:

    public static void bubbleSort(int[] numbers)
    {
        if (numbers == null) return;

        int temp = 0;
        int size = numbers.length;
        for (int i = 0; i < size -1; i++) {
            for (int j = 0; j < size - 1 -i ; j++) {
                if(numbers[j]>numbers[j+1])
                {
                    temp = numbers[j];
                    numbers[j]=numbers[j+1];
                    numbers[j+1]= temp;
                }
            }
        }
    }

==========================
2.选择排序:

// 每次找出最小的那个数
public static int[] selectSort(int[] nums)
    {
        if(nums == null)  return null;

        for(int i=0;i<nums.length;i++)
        {
            int k = i;

            for(int j=k+1; j<nums.length; j++)
            {
                if(nums[j]<nums[k])
                {
                    k = j;
                }
            }

            if(i!=k)
            {
                int temp = nums[i];
                nums[i] = nums[k];
                nums[k] =  temp;
            }
        }
        return nums;
    }

//这种算法是找出一个数,找出比这个数小的输交换。不太好理解的选择排序。
public static void selectSort(int[] numbers)
    {
        int length = numbers.length;
        for (int i=0; i<length ;i++)
        {
            int temp = numbers[i];
            int index = i;
            for (int j=i+1;j<length;j++)
            {
                if(numbers[j] < temp)
                {
                    temp = numbers[j];
                    index = j;
                }
            }
            numbers[index] = numbers[i];
            numbers[i] = temp;
        }
    }

==========================
3.插入排序:

 public static void insertSort(int[] datas)
    {
        int length = datas.length;
        int insertNum;
        for (int i=1;i<length;i++)
        {
            insertNum = datas[i];
            int j = i-1;
            while(j>=0 && datas[j]>insertNum)
            {
                datas[j+1] = datas[j];
                j--;
            }
            datas[j+1] = insertNum;
        }
    }

==========================
4.快速排序:

public static void quickSort(int[] numbers, int start, int end)
    {
        if(numbers==null) return;
        if(start<end)
        {
            int baseNum = numbers[start];
            int midNum;
            int i = start;
            int j = end;
            while(i<=j)
            {
                while(i < end && numbers[i]<baseNum)
                {
                    i++;
                }
                while (j>start && numbers[j]>baseNum)
                {
                    j--;
                }
                if(i<=j)
                {
                    midNum = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = midNum;
                    i++;
                    j--;
                }
                if(j>start)
                {
                    quickSort(numbers,start,j);
                }
                if(i<end)
                {
                    quickSort(numbers,i,end);
                }
            }
        }
    }

==========================
5.归并排序:

public static void mergeSort(int[] datas,int low,int hight)
    {
        int mid = (low+hight)/2;
        if(low<hight)
        {
            mergeSort(datas,low,mid);
            mergeSort(datas,mid+1,hight);
            merge(datas,low,mid,hight);
        }
    }


    private static void merge(int[] datas,int low,int mid,int hight)
    {
        int[] temp = new int[hight-low+1];
        int i=low;
        int j=mid+1;
        int k =0;
        while (i<=mid && j<=hight)
        {
            if(datas[i]<datas[j])
            {
                temp[k++]=datas[i++];
            }else
            {
                temp[k++]=datas[j++];
            }
        }
        while (i<=mid)
        {
            temp[k++] = datas[i++];
        }
        while (j<=hight)
        {
            temp[k++]=datas[j++];
        }
        for (int m=0;m<temp.length;m++)
        {
            datas[low+m] = temp[m];
        }
    }

==========================
6.堆排序:

 public static void heapSort(int[] datas)
    {
        createHeap(datas);

        for (int i=datas.length-1;i>1;--i)
        {
            int temp =datas[1];
            datas[1] = datas[i];
            datas[i] = temp;
            HeapAdjust(datas,1,i-1);
        }
    }

    private static void createHeap(int[] datas)
    {
        int length = datas.length-1;
        for (int i=length/2;i>0;i--)
        {
            HeapAdjust(datas,i,length);
        }
    }

    private static void HeapAdjust(int[] datas,int cur,int last)
    {
        int temp = datas[cur];
        for (int j=2*cur; j<=last; j *=2)
        {
            if(j<last && datas[j]< datas[j+1])
            {
                ++j;
            }
            if (temp >= datas[j])
            {
                break;
            }
            datas[cur] = datas[j];
            cur = j;
        }
        datas[cur] = temp;
    }

==========================
7.希尔排序

 private static void sheelSort(int[] datas)
    {
        if(datas == null) return;

        int len = datas.length;

        while (len!=0)
        {
            len = len/2;

            for (int i=0;i<len;i++)
            {
                for (int j=i+len;j<datas.length;j+=len)
                {
                    int k=j-len;
                    int temp = datas[j];


                    while (k>=0&& temp <datas[k])
                    {
                        datas[k+len] = datas[k];
                        k-=len;
                    }

                    datas[k+len]=temp;
                }
            }
        }
    }

==========================
8.基数排序

public static void baseSort(int[] datas)
    {
        int max = datas[0];
        for (int i=1;i<datas.length;i++)
        {
            if(datas[i]>max)
            {
                max = datas[i];
            }
        }
        int time = 0;
        while(max>0)
        {
            max/=10;
            time++;
        }

        List<ArrayList<Integer>> queue = new ArrayList<>();
        for (int i=0;i<10;i++)
        {
            ArrayList<Integer>  queueItem = new ArrayList<>();
            queue.add(queueItem);
        }
        for (int i=0;i<time;i++)
        {
            for (int j=0;j<datas.length;j++)
            {
        int x= (int) (datas[j] % Math.pow(10,i+1)/(int) Math.pow(10,i));
                ArrayList<Integer> queue2 = queue.get(x);
                queue2.add(datas[j]);
                queue.set(x,queue2);
            }

            int count =0;
            for (int k=0;k<10;k++)
            {
                while (queue.get(k).size()>0)
                {
                    ArrayList<Integer>  queue3 = queue.get(k);
                    datas[count] = queue3.get(0);
                    queue3.remove(0);
                    count++;
                }
            }
        }
    }

==========================
9.计数排序 https://www.cnblogs.com/developerY/p/3166462.html

private static int[] countSort(int[] datas,int k)
    {
        int[] C = new int[k+1];
        int length = datas.length;
        int sum = 0;
        int[] B = new int[length];

        for (int i=0;i<length;i++)
        {
            C[datas[i]]+=1;
        }
        for (int i=0;i<k+1;i++)
        {
            sum+=C[i];
            C[i] = sum;
        }
        for (int i=length-1;i>=0;i--)
        {
            B[C[datas[i]]-1] = datas[i];
            C[datas[i]]--;
        }
        return B;
    }

==========================
测试代码:

   public static void main(String[] args) {
              int[] a = {3, 4, 8, 2, 1, 6};
        //1.冒泡排序
        //bubbleSort(a);
        //print(a);

        //2.快速排序
        //quickSort(a,0,a.length-1);
        //print(a);

        //3.选择排序
        //selectSort(a);
        //print(a);

        //4.插入排序
        //insertSort(a);
        //print(a);

        //5.归并排序
        //mergeSort(a,0,a.length-1);
        //print(a);

        //6.堆排序
        //int[] b = {0,3, 4, 8, 2, 1, 6};
        //heapSort(b);
        //print(b);

        //7.希尔排序
        //sheelSort(a);
        //print(a);


        //8.基数排序
        //int[] c = {3, 4, 8, 2, 1, 6,100,98,66,1000};
        //baseSort(c);
        //print(c);

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

推荐阅读更多精彩内容