当前位置:编程学习 > C#/ASP.NET >>

递归实现【双端选择排序】C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 双选择排序
{
    class Program
    {

        static void Main(string[] args)
        {
            Random ra = new Random();
            int[] entry = new int[19];
            Console.WriteLine("未排序:");
            for (int i = 0; i < 19; i++)
            {

                entry[i] = ra.Next(0, 19);
                Console.WriteLine(entry[i]);
            }

            双选择排序(0, entry.Length - 1, entry);

            Console.WriteLine("----------------已排序-----------------------------");
            for (int i = 0; i < 19; i++)
            {


                Console.WriteLine(entry[i]);
            }
            Console.ReadLine();
        }

        static void print(int[] entry, int n)
        {
            for (int i = 0; i < n; i++)
            {


                Console.WriteLine(entry[i]);
            }
        }
        static void 双选择排序(int start, int end, int[] entry)
        {
            if (start < end)
            {
                int max_index = start;
                int min_index = start;

                select(start, end, entry, ref max_index, ref min_index);////找start到end之间的最大值下标和最小值下标


                swap(max_index, end, entry);////把最大值调到最后
                if (min_index == end)////如果最小值刚好在end的位置,那最小值已经被调到max_index的位置了【关键】
                {
                    swap(max_index, start, entry);
                }
                else
                    swap(min_index, start, entry);

                双选择排序(start + 1, end - 1, entry);

            }
            else
                return;
        }
        static void select(int start, int end, int[] entry, ref int max, ref int min)///在数组中的【start,end】片段找最小值下标和最大值下标
        {
            for (int i = start; i <= end; i++)
            {
                if (entry[i] < entry[min])
                    min = i;
                if (entry[i] > entry[max])
                    max = i;
            }
        }
        static void swap(int a, int b, int[] entry)///交换数组中下标为a和b的两个数
        ///
        {
            if (a != b)
            {
                int temp;
                temp = entry[a];
                entry[a] = entry[b];
                entry[b] = temp;
            }
        }
    }
} --------------------编程问答-------------------- 你想问什么? --------------------编程问答-------------------- 估计不是那啥:是在公示研究成果.
--------------------编程问答-------------------- 是的,你说中了。 --------------------编程问答-------------------- 代码和【算法】都没有问题。 --------------------编程问答-------------------- 大家好,本人博客里专写【新算法】:
【已更新列表】:
1.【多位数】【多重括号】【带负数】【字符表达式运算】【使用递归】【不用栈实现】

2.自己写的【新的】【排序算法】-【二分对调排序】

3.《修改》2分查找,速度绝对地提升【已证】

4。【自写】【求全排列】【新算法】【递归实现】

5.用【自己改过的2分】做的【2分插入排序】。。(C#) 速度绝对快于【原插入或原二分插入排序】

6.【自写】【递归】【双选择排序】速度比选择排序快
                                    
                                          【★火燎原】 --------------------编程问答-------------------- 如果你在  select(start, end, entry, ref max_index, ref min_index) 参数上再加一个“找第二大值的下标”是不是又发明了新算法?

比较一个算法算不算新发明,算不算“速度绝对提升”,需要一点点数学知识来写出空间和时间复杂度表达式。 --------------------编程问答-------------------- 排序算法速度复杂度表达式中,只考虑移动对象的复杂度。你的一趟扫描移动两个对象! --------------------编程问答-------------------- --------------------编程问答-------------------- 数组长度10万
Array.Sort用时 22.5096ms
双选择排序用时 不能完成,产生 “未处理 System.StackOverflowException”异常

数组长度1万
Array.Sort用时 2.1379ms
双选择排序 用时 338.2513ms

数组长度1000
Array.Sort用时 0.2141ms
双选择排序 用时 4.6067ms

数组长度100
Array.Sort用时 0.0642ms
双选择排序 用时 1.0256ms

数组长度10
Array.Sort用时 0.0511ms
双选择排序 用时 0.9764ms

数组长度3
Array.Sort用时 0.05ms
双选择排序 用时 0.988ms

结论:我真是个脑残,居然去试这样的代码。其实根本不需要试,一看到用递归就可以直接无视了。楼主还是洗洗睡吧,做个好梦。 --------------------编程问答-------------------- 呵呵,这是自己写的。就是改了选择排序。后来在网上找到双选择的没用递归,而且写错了,也是在CSDN里面的。 --------------------编程问答-------------------- 我的看法是:Array.Sort()是内置的(被写过的),这不是同一概念。 --------------------编程问答-------------------- 这不叫纯算法,,,这叫周星星自定义排序方法(linq+类冒泡?) --------------------编程问答-------------------- 我要的是【修改意见】or【不改&&重搞】,to 【Change】,有【】的发话。 --------------------编程问答-------------------- 【观念】问题。 --------------------编程问答-------------------- 呵呵,递归算法其实在实际开发中还是少用比较好,对系统开销比较大,如果是大量数据的话,那么程序的性能将会受到很大的影响!百万条数据在加上网络环境的影响,很可能是系统瘫痪,递归算法,好理解,但是不好用 --------------------编程问答-------------------- 递归算法确实不错,但是还是不懂
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,