排序题

公共函数

public static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

选择排序

// 选择排序,每次选取一个大的,或则小的
// 默认是升序,不稳定
// 本应两个版本(数组和链表),现在只做数组
    public static void chooseSort(int[] array) {
        int max = 0;
        int index = 0;
        for(int i = 0; i < array.length; i++ ) {
            max =  array[i];
            for(int j = i+1; j < array.length; j++) {
                if (array[j] > max) {
                    max = array[j];
                    index = j;
                }
            }
            if (array[i] != max) 
                swap(array, i, index);
        }
    }

冒泡排序

static void bubble_sort(int[] unsorted)
    {
        for (int i = 0; i < unsorted.length; i++)
        {
            for (int j = i; j < unsorted.length; j++)
            {
                if (unsorted[i] > unsorted[j])
                {
                    int temp = unsorted[i];
                    unsorted[i] = unsorted[j];
                    unsorted[j] = temp;
                }
            }
        }
  }

插入排序

// 插入排序,每次抽取一个,放在已排好序列中,稳定
    public static void insertSort(int[] array) {
        int temp = 0;
        for(int i = 0; i < array.length; i++) {
            temp = array[i];
            for(int j= i-1; j >= 0; j--)
            {
                if(array[j] > array[i]) {
                    array[j+1] = array[j];
                } else {
                    array[j+1] = temp;
                    break;
                }
            }
        }
    }

快速排序

// 快速排序:不稳定
// 根据文件,把控制当前排序进程的基准关键字放在关键位置上,左边都小于它, 右边都大于它
    public static void quickSort(int[] array, int left, int right) {        
        if (left < right) {
            int i = left;
            int j = right + 1;
            System.out.print("befor i = "+ i +" j is " + j +"\n");
            int pivot = array[left];
            System.out.print("pivot is " + pivot);
            do {
                do {
                    i++;
                } while(i <= right && array[i] < pivot );
                System.out.print("middle i = "+ i +" j is " + j +"\n");
                do {
                    j--;
                } while(array[j] > pivot && j >= left);
                System.out.print("in do , i = "+ i +" j is " + j +"\n");
                if(i < j) {
                    swap(array, i, j);
                }
            }while(i < j);
            System.out.print("i = "+ i +" j is " + j +"\n");
            printArray(array);
            System.out.print("after swap");
            swap(array,left,j);
            printArray(array);
            quickSort(array, left, j-1);                        
            quickSort(array, j+1, right);
        }
    }

归并排序——迭代算法

// 1 2  5 7 2 4 3 ,每两两一组 合并 
// 第一轮 12 57 24 3
// 第二轮 1257 234
// 第三轮1223457
// 归并从left到middle; middle+1到right的队列
    public static void merge(int[] array, int[] sorted, int left, int middle, int right) {
        int index = left;       
        int j = middle + 1;
        while(left <= middle && j <= right) {
            if (array[left] <= array[j]) {
                sorted[index]= array[left];
                left++;
                
            }else {
                sorted[index] = array[j];
                j++;                
            }
            index++;
        }
        while (left <= middle) {
            sorted[index++] = array[left++];
        }
        while (j <= right) {
            sorted[index++] = array[j++];
        }
        
    }

// 执行一轮归并
// merge_pass:sorted 表示存储新的数组,n表示list中的元素个数,length是一个subfile的长度
    public static void merge_pass(int[] array, int[] sorted, int n, int length) {
        // i <= n-2*length, 是防止后面不够
        int i;
        printArray(array);
        for(i = 0; i <= n -2*length; i+= 2*length) {
            merge(array, sorted, i, i+length-1, i+ 2*length-1);
            System.out.println("i = " + i + "n = " + n);
            printArray(sorted);
        }
        System.out.println(""+(i+length < n)  +"i = " + i + "n = " + n);
        if(i+length < n) {
            // 还剩了一个多队列
            merge(array, sorted, i, i+length-1, n-1);
        }else {
            for(int j = i; j < n; j++)
                sorted[j] = array[j];
        }
        System.out.println("length "+ length);
        printArray(sorted);
        System.out.println("\n");
    }

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

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,164评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,727评论 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,239评论 0 2
  • 一. 写在前面 要学习算法,“排序”是一个回避不了的重要话题,在分析完并查集算法和常用数据结构之后,今天我们终于可...
    Leesper阅读 2,516评论 0 40
  • 1、愿意无条件力挺你的人 如果有人愿意挺你,他肯定是你的贵人。当他愿意无条件的挺你,只因为他相信“你”这个人,他接...
    运安阁阁主阅读 196评论 0 0