Chinaunix首页 | 论坛 | 博客
  • 博客访问: 475331
  • 博文数量: 111
  • 博客积分: 3146
  • 博客等级: 中校
  • 技术积分: 939
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-07 11:23
个人简介

Nathing

文章分类

全部博文(111)

文章存档

2016年(2)

2015年(1)

2014年(31)

2012年(2)

2011年(9)

2010年(36)

2009年(30)

我的朋友

分类: Java

2010-11-05 17:59:43

public class Sort
{
    /**
     * @param args
     */

    public static void main(String[] args)
    {
        int a[] = {2,4,5,3,7,0,1,9,6};

        bubble(a);
        print(a);

        int b[] = {2,4,5,3,7,0,1,9,6};
        select(b);
        print(b);

        int d[] = {2,4,5,3,7,0,1,9,6};
        quick(d, 0, (d.length)-1);
        print(d);
        
        System.out.println(binarySearch(d,9));
        swap(d);
        print(d);

    }

    /**
     * 二分法查找,必须建立在排好序的基础上
     * @param a
     * @param num
     * @return
     */

    private static int binarySearch(int[] a, int num)
    {
        if (a.length<1) return -1;
        int startPos = 0;
        int endPos = a.length - 1;
        int m = (startPos + endPos) / 2;
        while (startPos <= endPos)
        {
            if ( num == a[m]) return m;
            if (num > a[m])
                startPos = m + 1;
            if (num < a[m])
                endPos = m - 1;
            m = (startPos + endPos) / 2;
                
        }
        return -1;
    }

    /**
     * 算法:排序開始時,它選擇列表的中間位置的值作為列表的分隔符v,
     * 於是排序把列表分成兩個列表,一個列表的值小於列表分隔符,
     * 另一個列表的值大於列表分隔符.然後排序在兩個列表中遞歸.
     * 排序每調用自身一次,它就把列表分成更小的列表,直到無法分解,序列就排好了.
     * @param arr
     * @param first
     * @param last
     */

    private static void quick(int[] arr, int first, int last)
    {
        int temp = 0;
        //左邊位置初始化為數組第一個元素
        int low = first;
        //右邊位置初始化為數組最後一個元素
        int high = last;
        int v;
        //System.out.println((first+last) / 2);
        v = arr[(first+last)/2];
        
        do
        {
            //前端元素小於分隔符值的就不需要交換,走到下一個
            while (low < last && arr[low] < v)
            {
                low++;
            }
            //后端元素大於分隔符值的就不需要交換,走到上一個
            while (high > first && arr[high] > v)
            {
                high--;
            }
            //跑出当前段了,结束本段的"互扔"过程
            if (low > high)
            {
                break;
            }
            //开始互换,但 low == high 的情况说明是同一个元素,不用交换
            if (low < high)
            {
                temp = arr[low];
                arr[low] = arr[high];
                arr[high] = temp;
            }
            //交換后往后走
            low++;            
            //交換后往前走
            high--;

        }
        while (true);
        if (first < high)
            //前半段遞歸
            quick(arr, first, high);
        if (low < last)
            //後半段遞歸
            quick(arr, low, last);
    }

    protected static void bubble(int a[])
    {
        int temp = 0;
        for (int i = 0; i < a.length; i++)
        {
            for (int j = 0; j < (a.length - i - 1); j++)
            {
                if (a[j + 1] < a[j])
                {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
    }

    static void select(int a[])
    {
        int temp = 0;
        int minIndex = 0;

        for (int i = 0; i < a.length; i++)
        {
            // 每次都假设i所在位置的元素是最小的
            minIndex = i;
            for (int j = i + 1; j < a.length; j++)
            {
                // 假设失败,那么最小元素就是i的下一个元素,也就是j
                if (a[minIndex] > a[j])
                {
                    minIndex = j;
                }
            }
            // 把当前最小元素和前面第i个元素交换:
            if (minIndex != i)
            {
                temp = a[i];
                a[i] = a[minIndex];
                a[minIndex] = temp;
            }
        }
    }
    
    private static void swap(int a[])
    {
        int len = a.length;
        int temp =0;
        for (int i =0; i<len/2; i++)
        {
            temp = a[i];
            a[i] = a[len-i-1];
            a[len-i-1] = temp;
        }
    }

    private static void print(int a[])
    {
        for (int i = 0; i < a.length; i++)
        {
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }
}


阅读(563) | 评论(1) | 转发(0) |
0

上一篇:Strategy策略模式

下一篇:单例模式

给主人留下些什么吧!~~

chinaunix网友2010-11-06 12:52:27

Good