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

Code
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; //在已排序序列中插入当前值
            }
        }
    }

public class Program
    {
        public static void Main()
        {
            Car[] carArr ={
                new Car("Benz",210000), new Car("BMW",150000), new Car("VW",130000),
                 new Car("Ford",140000), new Car("Kia",58000), new Car("QQ",30000),
                 new Car("Fiat",200000), new Car("Toyota",170000), new Car("Mazda",140000),

};
            CompareOperation sortOp = new CompareOperation(Car.OrderByCarPrice); //按照价格排序
            //CompareOperation sortOp = new CompareOperation(Car.OrderByCarName); //按照名称排序
            //BubbleSorter.Sort(carArr, sortOp); //冒泡排序
            QuickSort.Sort(carArr, sortOp); //快速排序
            //SelectionSort.Sort(carArr, sortOp);//选择排序
            //InsertSort.Sort(carArr, sortOp);//插入排序
            for (int i = 0; i < carArr.Length; i++)
            {
                Console.WriteLine(carArr[i].ToString());
            }
            Console.Read();
        }
    }
}

小结:在实际的项目中,我们基本不用按照上面的方式写排序代码,c#为我们定义了几个泛型排序接口(IComparable,IComparer等),重新实现接口中的方法,利用泛型的集合类的Sort方法就可以了。

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

  1. 回炉篇5—数据结构(4)之冒泡、选择、插入排序算法

    冒泡.选择.插入排序算法 排序大家都很熟了,很古老的算法,古老才有必要回炉再看一遍,经典才值得研究. 1.冒泡排序 从字面意思理解,水泡从水底冒出到水面的过程中,由小慢慢大,最后大泡泡冒出水面,了解这 ...

  2. Java数据结构和算法(三)——冒泡、选择、插入排序算法

    上一篇博客我们实现的数组结构是无序的,也就是纯粹按照插入顺序进行排列,那么如何进行元素排序,本篇博客我们介绍几种简单的排序算法. 回到顶部 1.冒泡排序 这个名词的由来很好理解,一般河水中的冒泡,水底 ...

  3. 冒泡、选择、插入排序算法

    1.冒泡排序: ①.比较相邻的元素.如果第一个比第二个大,就交换他们两个. ②.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数(也就是第一波冒泡完成). ...

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

    冒泡排序 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.  即:每当两相邻的数比较后发现它们的排序与排序要求 ...

  5. 面试必备:深入了解冒泡、选择和插入排序的优缺点

    前言 相信排序对于每一个程序员来说都不会陌生,很可能你学的第一个算法就是排序,尤其冒泡排序大家可能都是信手拈来,但是当从学校走入了职场之后,这些经典的排序已经慢慢淡出了我们的视线,因为在日常开发中,高 ...

  6. 冒泡法和选择法 排序算法实现

    @冒泡法和选择法 排序算法实现 void swap(int& a, int& b) {int temp=0;temp = a;a = b;b = temp; }void bubble_ ...

  7. 【算法之美】不要再用冒泡、选择、插入排序了,丢不起这人!

    文章目录 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 快速排序 5. 堆排列 6. 归并排列 7. 希尔排序 8. 优化后的快排函数sort() 前言 排序算法在算法与数据结构中很常见,在学 ...

  8. 反射,hashlib模块,正则匹配,冒泡,选择,插入排序

    一.反射(自省) 首先通过一个例子来看一下本文中可能用到的对象和相关概念. import sys # 模块,sys指向这个模块对象import inspectdef foo(): pass # 函数, ...

  9. python实现冒泡,选择,插入排序(凑合着看)

    前言: 排序无非把无序列表变为有序列表 而且python还有内置函数sort(),但是为了学习算法还是的了解一下这三人组算法 1.冒泡排序 1.思想 1.列表每相邻的两个数,按大小规则,交换位置 2. ...

最新文章

  1. 百度搜索查询命令——组合型
  2. linux下 zip解压 tar解压 gz解压 bz2等各种解压文件命令
  3. spring cloud的eureka.client.service-url.defaultZone配置eureka集群的写法
  4. mysql秒级平滑_DDM实践:数据库秒级平滑扩容方案
  5. Linux基础学习一:初步认识linux
  6. DB9 串口母对母转接头是个坑
  7. html怎么打开一个新窗口打开文件,js怎么打开新窗口
  8. 《实战突击:Java Web项目整合开发》简介及源码
  9. 关于集成网卡怎么设置pxe网卡启动
  10. CentOS 7拨号上网(ADSL PPPoE)
  11. 【排列问题】-全排列
  12. 知名云计算厂商云宏加入龙蜥社区,共同打造信息安全坚实“地基”
  13. 金钱数字转换为大写中文
  14. 友盟社会化分享 QQ空间不显示分享的图片 (已解决)
  15. FC4下安装plog快速指南(plog版本:1.01)
  16. 少年派 —— 之 读书
  17. C++学习笔记与回顾(构造函数、链表等)
  18. scp指令,进行服务器之间数据传输
  19. 公共场所安全蹭网andwifi热点软件构建安全网络!
  20. 华为手机一直android,为何我的华为手机一直停留在Android正在升级…,高人求助!...

热门文章

  1. C#正则表达式:移除文本中所有方括号和其中的内容
  2. Java配置环境变量及其意义
  3. ecshop将编辑器更换为kindeditor
  4. pyton BeautifulSoup中文API
  5. Cookie编程入门篇
  6. vue升级之路(三)-- vue-router的使用
  7. [oracle] Oracle存储过程里操作BLOB的字节数据的办法,例如写入32位整数
  8. [UVA 10827] Maximum sum on a torus
  9. 简单入门循环神经网络RNN:时间序列数据的首选神经网络
  10. IOS之未解问题--关于IOS图像渲染CPU和GPU