冒泡+快速+堆排序

package xie.struct;

import java.util.ArrayList;

public class Sort<T extends Comparable<T>> {
    public static final int QuickSort = 1;
    public static final int SelectMin = 4;
    public static final int MaoPao = 3;
    public static final int HeapSort = 2;

    private ArrayList<T> data;//数据存储

    public Sort() {
    }

    public void runSort(int mode) {
        switch (mode) {
        case 1:
            System.out.println("快速排序输出:");
            this.QuickSort(data, 0, data.size() - 1);
            break;
        case 2:
            System.out.println("堆排序输出:");
            this.heapSort();
            break;
        case 3:
            System.out.println("冒泡排序输出:");
            this.MaoPao();
            break;
        case 4:
            break;
        default:
            break;
        }
    }

    public void setData(ArrayList<T> a) {
        this.data = a;
    }

    public void addData(T data) {
        this.data.add(data);
    }

    public String toString() {
        for (int i = 0; i < data.size(); i++)
            System.out.print(data.get(i) + "/");
        return null;

    }

    public void MaoPao()
    {
        int i,j;
        int n=this.data.size();
        for(i=0;i<n;i++)
            for(j=1;j<n-i;j++){
                if(this.data.get(j-1).compareTo(this.data.get(j))>0)
                {
                T swap=this.data.get(j);
                this.data.set(j,this.data.get(j-1));
                this.data.set(j-1,swap);
                }
            }
    }

    /*
     * 快速排序代码
     */
    private void QuickSort(ArrayList<T> a, int left, int right) {
        if (left < right) {
            int low = left;
            int high = right;
            T key = a.get(low);
            while (low < high) {
                while (low < high && a.get(high).compareTo(key) >= 0)
                    high--;
                a.set(low, a.get(high));
                while (low < high && a.get(low).compareTo(key) < 0)
                    low++;
                a.set(high, a.get(low));
            }
            a.set(low, key);
            QuickSort(a, left, low - 1);
            QuickSort(a, low + 1, right);
        }
    }

    /*
     *
     * 堆排序函数代码
     */

    private void buildHeap() {
        int len = this.data.size();
        int i;
        for (i = len / 2 - 1; i >= 0; i--)
            this.adjustHeap(i);

    }

    private void adjustHeap(int index) {
        int len = this.data.size();
        int left = index * 2 + 1;
        int right = index * 2 + 2;
        int smaller = left;
        T swap;
        if (left > len - 1)
            return;
        if (right < len
                && this.data.get(left).compareTo(this.data.get(right)) > 0) {
            smaller = right;
        }
        if (smaller < len
                && this.data.get(index).compareTo(this.data.get(smaller)) > 0) {
            swap = this.data.get(smaller);
            this.data.set(smaller, this.data.get(index));
            this.data.set(index, swap);
            this.adjustHeap(smaller);
        }
    }

    private void heapSort() {
        this.buildHeap();
        int len = this.data.size();
        while (len > 0) {
            System.out.print(this.data.get(0)+"/");
            this.data.set(0, this.data.get(len - 1));
            this.data.remove(len - 1);
            len--;
            this.adjustHeap(0);
        }
    }

    /*
     *
     * 测试代码
     */

    public static void main(String args[]) {
        ArrayList<String> array = new ArrayList<String>();
        array.add("A");
        array.add("D");
        array.add("G");
        array.add("H");
        array.add("S");
        array.add("J");
        array.add("B");
        Sort<String> sort = new Sort<String>();
        sort.setData(array);
        sort.runSort(Sort.QuickSort);
        sort.toString();

        sort.setData(array);
        sort.runSort(Sort.MaoPao);
        sort.toString();

        sort.setData(array);
        sort.runSort(Sort.HeapSort);
    }
}

快速排序输出:
A/B/D/G/H/J/S/

冒泡排序输出:
A/B/D/G/H/J/S/

堆排序输出:
A/B/D/G/H/J/S/

时间: 2024-11-07 22:55:58

冒泡+快速+堆排序的相关文章

九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序

  闲着的时候看到一篇“九大排序算法在总结”,瞬间觉得之前数据结构其实都有学过,但当初大多数都只是老师随口带过,并没有仔细研究一下.遂觉:这是欠下的账,现在该还了.   排序按照空间分类: In-place sort不占用额外内存或占用常数的内存 插入排序.选择排序.冒泡排序.堆排序.快速排序. Out-place sort:归并排序.计数排序.基数排序.桶排序. 或者按照稳定性分类: stable sort:插入排序.冒泡排序.归并排序.计数排序.基数排序.桶排序. unstable sort

排序算法之冒泡&amp;快速&amp;桶式算法

1 <?php 2 3 /** 4 * 冒泡排序算法(从小到大) 5 * @param array &$arr 待排序数组 6 */ 7 function bubbleSort(&$arr){ 8 $flag = 0; 9 $arr_size = count($arr); 10 for($i=1; $i<=$arr_size-1; ++$i){ 11 12 for($j=0; $j<$arr_size-$i; ++$j){ 13 if($arr[$j] > $arr

【技术宅2】插入选择冒泡快速交换排序算法

//插入排序(一维数组) //插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止. function insert_sort($arr){ $count=count($arr); for($i=1;$i<$count;$i++){ $tem=$arr[$i];// 获得当前值 $j=$i-1;// 获得当前值的前一个位置 while($arr[$j]>$tem){// 如果当前值小于前一

选择 冒泡 快速 插入排序

/** * 演示各种排序法 */package com.test1;import java.util.*;public class Demo5_3 { public static void main(String[] args) { // TODO Auto-generated method stub int len=8; int arr1[]=new int[len]; for(int i=0;i<len;i++) { //让程序随机产生一个1-10000的数 //Math.random()会

ios开发——常用经典算法OC篇&amp;冒泡/快速

冒泡排序与快速排序 1.序言 ios开发中涉及到算法的地方还真不多,除非你的应用程序真的非常大,或者你想你的应用程序性能非常好才会去想到关于算法方面的性能优化,而在ios开发中真的能用得到的也就是关于排序的,当然如果你是做游戏的话那么你可能会涉及到不少的算法或者优化问题,但是这不是本篇文章讨论的范围. 后面的文章中,我将会给大家详细介绍八大算法. 2.冒泡排序 2.1 引出 前面的两篇博客里讲的插入排序是基于“逐个记录插入”,选择排序是基于“选择”,那么冒泡排序其实是基于“交换”.每次从第一个记

转:转一个搞ACM需要的掌握的算法. .

要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来.  适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红,  发挥自己的长处,这才是重要的. 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,  因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打  出来.  1.最短路(Floyd.Dijstra,BellmanFord)  2.最小生成树(先写个prim,kruscal要用并查集,不好写)

算法初学者指南

摘自网络,对于这个训练计划,我只能膜拜,~ 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15 分钟内打完,甚至关掉显示器都可以把程序打 出来. 1.最短路(Floyd.Dijstra,BellmanFord) 2. 最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘.判线段相交.然后写个凸包. 6.BFS.DFS,同时熟练hash表(

ACM知识点清单

本文直接来源http://blog.csdn.net/xuanandting/article/details/52160859,如有侵权,请联系删除. 训练过ACM等程序设计竞赛的人在算法上有较大的优势,这就说明当你编程能力提高之后,主要时间是花在思考算法上,不是花在写程序与debug上. 下面给个计划你练练: 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短路(Fl

算法学习知识点

 ACMer必备知识(这么多呀,慢慢学了-- 图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra)   (可以用 Dijkstra解决问题的特征) 负边权最短路径   Bellman-Ford Bellman-Ford的 Yen-氏优化 差分约束系统 Floyd 广义路径问题   传递闭包 极小极大距离 /极大极小距离 Euler Path / Tour 圈套圈算法 混合图的 EulerPath / Tour  Hamilton Path / Tour 特殊图的