c#冒泡、快速、选择和插入排序算法的项目应用

在之前的一篇文章里,我们简单地实现了对一维数组的四种排序算法,但是 在实际的项目中,我们排序的方式可能(几乎是一定)不止仅仅按照数字排序, 我们常常按照合适的需要的排序方式进行排序,比如航班信息可能按时间排序, 商品信息可能按价格排序等等。下面改进之前的那一篇“c#实现冒泡、快 速、选择和插入排序算法”里的代码,实现可以对不同对象(实例中是Car )的按照不同排序类型(实例中是价格和名称)的方式排序。好了,Code is cheap。看代码了:

using System;
using System.Collections;
using System.Collections.Generic;

namespace Sorter
{
    //声明委托,可以选择排序方式进行排序(而不局限于按整数排序)
    public delegate bool CompareOperation(object carPrev,object carNext);
    /// <summary>
    /// 汽车类  用来构建汽车数组按照价格或者车名排序
    /// </summary>
    public class Car
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private decimal price;
        public decimal Price
        {
            get { return price; }
            set { price = value; }
        }
        public Car(string name, decimal price)
        {
            this.name = name;
            this.price = price;
        }
        public override string ToString()
        {
            return string.Format("name:{0},price: {1:c}", name, price);
        }
        /// <summary>
        /// 将object转换为Car类,按照车名比较
        /// </summary>
        /// <param name="carPrev"></param>
        /// <param name="carNext"></param>
        /// <returns></returns>
        public static bool OrderByCarName(object objPrev, object objNext)
        {
            Car carPrev = (Car)objPrev;
            Car carNext = (Car)objNext;
            return (carPrev.name.CompareTo(carNext.name) < 0) ? true : false;
        }

        /// <summary>
        /// 将object转换为Car类,按照价格比较
        /// </summary>
        /// <param name="carPrev"></param>
        /// <param name="carNext"></param>
        /// <returns></returns>
        public static bool OrderByCarPrice(object objPrev, object objNext)
        {
            Car carPrev = (Car)objPrev;
            Car carNext = (Car)objNext;
            return (carPrev.price < carNext.price) ? true : false;
        }
    }

    /// <summary>
    /// 冒泡排序
    /// </summary>
    public class BubbleSorter
    {
        static public void Sort(Object[] objArr, CompareOperation sortOp)
        {
            bool flag = false; //交换标志
            for (int i = 1; i < objArr.Length; i++) //最 多做objArr.Length-1趟排序
            {
                flag = false;
                for (int j = objArr.Length - 1; j >= i; j--) //对当前无序区自下向上扫描
                {
                    if (sortOp(objArr[j], objArr[j - 1])) //当前无序区: 轻的在下面,“冒泡”到上面
                    {
                        object tmpObj = objArr [j];
                        objArr[j] = objArr[j - 1];
                        objArr[j - 1] = tmpObj;
                        flag = true;
                    }
                }
                if (!flag) //如果没有发生交换,终止算法
                    return;
            }
        }
    }

    /// <summary>
    /// 快速排序
    /// </summary>
    public class QuickSort
    {
        public static void Sort(object[] objArr, CompareOperation sortOp)
        {
            Sort(objArr, sortOp, 0, objArr.Length - 1);
        }

        private static void Sort (object[] objArr, CompareOperation sortOp, int left, int right)
        {
            if (left < right)
            {
                Object middle = objArr[(left + right) / 2];
                int i = left - 1;
                int j = right + 1;
                while (true)
                {
                    while (sortOp(objArr[++i], middle)) ;

                    while (sortOp(middle, objArr[--j])) ;

                     if (i >= j)
                        break;

                     Swap(objArr, i, j);
                }
                Sort(objArr, sortOp, left, i - 1);
                Sort(objArr, sortOp, j + 1, right);
            }
        }

        private static void Swap (object[] objArr, int i, int j)
        {
            object tmpObj = objArr[i];
            objArr[i] = objArr[j];
            objArr[j] = tmpObj;
        }
    }

    /// <summary>
    ///  选择排序(Selection Sort)的基本思想是:每一趟从待排序的记 录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录 排序完毕。
    /// </summary>
    public class SelectionSort
    {
        static public void Sort(Object[] objArr, CompareOperation sortOp)
        {
            int min;
            for (int i = 0; i < objArr.Length - 1; i++)
            {
                min = i;
                for (int j = i + 1; j < objArr.Length; j++)
                {
                    if (sortOp(objArr[j], objArr [min]))
                    {
                        min = j;
                    }
                }
                object tmpObj = objArr[i];
                objArr[i] = objArr[min];
                objArr[min] = tmpObj;
            }
        }
    }

    /// <summary>
    /// 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法 。它的工作原理是通过构建有序序列,对于未排序数据,
    /// 在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在 实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),
    /// 因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位 , 为最新元素提供插入空间。
    /// </summary>
    public class InsertSort
    {
        static public void Sort(Object[] objArr, CompareOperation sortOp)
        {
            for (int i = 1; i < objArr.Length; i++) //i 从1开始
            {
                object t = objArr[i]; //标志当前未排序 数据
                int j = i;
                while ((j > 0) && (sortOp (t,objArr[j - 1])))
                {
                    objArr[j] = objArr[j - 1];
                    j--;
                }
                objArr[j] = t; //在已排序序列中插入当前 值
            }
        }
    }

时间: 2024-09-20 04:03:43

c#冒泡、快速、选择和插入排序算法的项目应用的相关文章

Java冒泡,选择,插入排序算法

冒泡排序 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.  即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 第一次比较排序的结果:会把其中最大的数据排到最大的索引处 第二次比较排序后的结果:因为第一次已经把最大的一个数据放到了最大的索引的地方,所以这次要进行比较的数据比数组里面的元素的数据个数-1个,而第二大的数据也会排到第二大的索引处 第三次比较排序的结果:跟第二次差不多,只是这

Python 冒泡,选择,插入排序使用实例_python

最近学习了python基础,写一下3大排序练练手: 复制代码 代码如下: ''' Created on 2013-8-23 @author: codegeek ''' //冒泡排序 def bubble_sort(seq):     for i in range(len(seq)):         for j in range(i,len(seq)):             if seq[j] < seq[i]:                 tmp = seq[j]           

PHP 冒泡/快速/选择/插入排序算法实例讲解

四大基本排序算法分别是:冒泡排序法,快速排序法,选择排序法,插入排序法,本文我们用 PHP 实例讲解这四大基本排序. 1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 代码实现: $arr=array(1,43,54,62,21,66,32,78,36,76,39);  function bubbleSort($arr){    $l

c#实现冒泡、快速、选择和插入排序算法

去年11月份利用冒泡排序,用js实现了一个机票查询结果按照机票的票面价格和出发日期的页面无刷新排序.这一段时间客户又要求改为按照实际支付价格和日期进行排序,匆匆改好以后,感觉自己的算法和数据结构的能力几乎荒废了(好像以前也没有过这种能力^_^).这里整理一下常用的排序算法,用c#实现,以备日后再用.Code is cheap.看具体实现吧. 1.冒泡排序 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡.根据轻气泡不能在重气泡之下的原则,从下往上扫描数

java-哪位大神能具体讲一下冒泡法和选择排序的用法,区别?

问题描述 哪位大神能具体讲一下冒泡法和选择排序的用法,区别? 哪位大神能具体讲一下冒泡法和选择排序的用法,区别? 解决方案 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的:如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法. #include <stdio.h> #defin

DeepMind提出快速调参新算法PBT,适用GAN训练(附论文)

从围棋到Atari游戏到图像识别和语言翻译,神经网络在各个领域都取得了巨大的成功.但是经常容易被忽视的是,神经网络在某个特定应用中的成功通常取决于在研究初始时所做的一系列选择,包括选择要使用的网络类型以及用于训练的数据和方法.目前,这些选择(被称作超参数)是通过经验.随机搜索或计算密集型的搜索过程来实现的. DeepMind在最近的一篇论文<基于群体的神经网络训练>(Population Based Training of Neural Networks)中,提出了一种新的训练神经网络的方法,

快速幂取模算法

所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.我们先从简单的例子入手:求abmodc 算法1.直接设计这个算法: int ans = 1; for(int i = 1;i<=b;i++) { ans = ans * a; } ans = ans % c; 缺点:这个算法存在着明显的问题,如果a和b过大,很容易就会溢出. 我们先来看看第一个改进方案:在讲

C 实现的插入排序算法

插入排序算法的原理 有一个很形象的比喻,每次从牌堆里抽一张新牌时,左手一般拿着的是已经排好序的旧牌,有新牌来的时候,会不由自主的从右到左的插入进去.后续的牌按照这个规律下去,最后左手的牌都是排好序了. 现在用程序语言的角度来说明插入排序原理. 从数组的第二位开始loop,这是外loop 开启一个内loop,依次检查外loop当前数组值的左侧,如果比当前数组值大,则左侧值向右移动,直到碰到比当前值小的或者内loop结束,此时把当前值放入 左侧留下的空位. 下面是C 实现的完整代码 #include

JAVA实现插入排序算法

package Utils.Sort; /** *插入排序,要求待排序的数组必须实现Comparable接口 */ public class InsertSort implements SortStrategy { /** *利用插入排序算法对obj进行排序 */ public void sort(Comparable []obj) { if (obj == null) { throw new NullPointerException("The argument can not be null!