3.5.2 冒泡排序类

那么,我们就以冒泡排序为例,把它改造成一个类。首先,单击菜单,“项目”-“添加类”,添加一个BubbleSort.cs类文件。IDE自动为我们创建如下代码:
using System;
using System.Collections.Generic;
using System.Text;

namespace Chapter35
ExpandedBlockStart.gifContractedBlock.gif
{
    
class BubbleSort
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
    }

}

  从这段代码中我们可以知道:
  ·我们的类在Chapter35命名空间内,由于主程序也在这个命名空间内,不需要 using Chapter35 就可以直接使用 BubbleSort 类。
  ·系统已经 using 了三个命名空间,可以直接使用这些命名空间里面的类型。

 

  在详细介绍类以及类的各种成员以前,我想先让大家看完整的 BubbleSort.cs代码,这是一典型的类,你可能会惊讶和先前的排序代码相比面目全非。

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

namespace Chapter3
ExpandedBlockStart.gifContractedBlock.gif
{
    
enum SortType
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        ASC,  
//正序 A-Z
        DESC  //到序 Z-A
    }


    
class BubbleSort
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        # region 字段
        
// 表示排序类型的私有字段
        private SortType order;
        
// 表示排序数组的私有字段
        private int[] list;
        
// 表示迭代次数的私有字段
        private int iterateCount;
        # endregion

        # region 属性
        
// 表示排序类型的属性,可读可写
        public SortType Order
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return order; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set { order = value; }
        }

        
// 表示排序数组的属性,可读可写
        public int[] List
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return list; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set { list = value; }
        }

        
// 表示迭代次数的属性,只读
        public int IterateCount
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return iterateCount; }
        }

        # endregion

        # region 构造方法
        
// 没有任何参数的构造方法
        public BubbleSort()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            order 
= SortType.ASC;
        }

        
// 带有一个参数的重载构造方法
        public BubbleSort(int[] arr)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            list 
= arr;
            order 
= SortType.ASC;
        }

        
// 带有两个参数的重载构造方法
        public BubbleSort(int[] arr, SortType type)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            list 
= arr;
            order 
= type;
        }

        # endregion

        # region 私有方法
        
// 用于交换两个变量私有方法
        private void Swap(ref int a, ref int b)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
int c = a;
            a 
= b;
            b 
= c;
        }

        # endregion

        # region 公有方法
        
// 用于排序操作的公有方法
        public void Sort()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
bool isOK = false;
            iterateCount 
= 0;
            
while (!isOK)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                isOK 
= true;
                
for (int i = 0; i < list.Length - 1; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    iterateCount
++;
                    
switch (order)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        
case SortType.ASC:
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
                                
if (list[i] > list[i + 1])
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
{
                                    Swap(
ref list[i], ref list[i + 1]);
                                    isOK 
= false;
                                }

                                
break;
                            }

                        
case SortType.DESC:
ExpandedSubBlockStart.gifContractedSubBlock.gif                            
{
                                
if (list[i] < list[i + 1])
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
{
                                    Swap(
ref list[i], ref list[i + 1]);
                                    isOK 
= false;
                                }

                                
break;
                            }

                    }

                }

            }

        }

        
// 用于把字符数组转化为字符串的公有方法
        public string GetDataString()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            StringBuilder sb 
= new StringBuilder();
            
for (int i = 0; i < list.Length; i++)
                sb.Append(list[i]);
            
return sb.ToString();
        }

        
// 用于把字符数组转化为字符串的公有重载方法,接受一个字符串参数作为分割符
        public string GetDataString(string separator)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            StringBuilder sb 
= new StringBuilder();
            
for (int i = 0; i < list.Length; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                sb.Append(list[i]);
                sb.Append(separator);
            }

            sb.Remove(sb.Length 
- separator.Length, separator.Length);
            
return sb.ToString();
        }

        # endregion
    }

}

调用类的代码如下:
ExpandedBlockStart.gifContractedBlock.gifint[] list1 = 1065792834 };
BubbleSort sort 
= new BubbleSort(list1);
Console.WriteLine(
"排序前: " + sort.GetDataString());
sort.Sort();
Console.WriteLine(
"迭代次数: " + sort.IterateCount);
Console.WriteLine(
"排序后: " + sort.GetDataString());
Console.WriteLine(
"---------------------分割符---------------------");
ExpandedBlockStart.gifContractedBlock.gif
int[] list2 = 7698534210 };
sort.List 
= list2;
Console.WriteLine(
"排序前: " + sort.GetDataString());
sort.Order 
= SortType.DESC;
sort.Sort();
Console.WriteLine(
"迭代次数: " + sort.IterateCount);
Console.WriteLine(
"排序后: " + sort.GetDataString("->"));

  不去看代码,从运行后的效果可以看出这个 BubbleSort 类相比先前做的例子有以下改进:
  ·支持从小到大、从大到小两种排序类型。
  ·支持自定义输出的分割符,比如“->”。
  ·可以知道排序的迭代次数。
  假设冒泡排序类是别人写的,我们先来看一下调用的代码熟悉.NET下对象使用:
  1. 第一行代码声明了一个整数数组用于排序。
  2. 第二行代码实例化了一个 BubbleSort 类。前面提到过,类是一个抽象的东西,要为我们所用就需要先得到一个实例。就好比我们先要买一个真正的房子然后才能居住。BubbleSort sort = new BubbleSort(list1); 在实例化的时候把排序数组直接赋值给类的构造方法,然后得到的实例为 sort。构造方法可以理解为一个初始化方法。
  3. 第三行代码调用了 BubbleSort 的 GetDataString()方法。GetDataString()方法返回一个字符串表示数组的内容。方法可以理解为一个具有某种操作的功能,可以接受一些参数并返回一个值,在这里的GetDataString()方法返回一个字符串。
  4. 第4行代码调用了 BubbleSort 的 Sort() 方法进行排序操作。 Sort()方法不返回任何值。
  5. 第5行代码输出 BubbleSort 的 IterateCount 属性的值,它表示某次排序操作的迭代(循环)次数。
  6. 第6行代码再次调用 BubbleSort 的 GetDataString() 方法输出排序后的数组。
  7. 第7行代码输出了一行分割符,用于再一次的反向排序。
  8. 第8行代码声明了另外一个整数数组用于排序。
  9. 第9行代码重新设置了 BubbleSort 的 List 属性为新的数组
  10. 第10行代码调用了 BubbleSort 的 GetDataString()方法输出排序前的数组。
  11. 第11行代码设置 BubbleSort 的 Order 属性为 SortType.DESC,表示排序方式使用倒序。Order性中的类型是SortType枚举。鼠标停留在Order字段上,IDE显示了属性的类型。
  12. 第12行代码再次调用 BubbleSort 的 Sort() 方法进行排序操作。
  13. 第13行代码输出迭代次数。
  14. 第14行代码再次调用了BubbleSort的GetDataString()方法输出拓序后的数组。和上次排序不同,这里我们为GetDataString()赋值了一个分割符,数组的每个元素都使用“->”进行分割。你可能会奇怪,我们调用的都是GetDataString()方法,怎么一次可以使用参数一次又不可以使用参数?这个问题暂留着稍后回答。

  BubbleSort 类的确工作得很好,我们并不需要知道它是怎么实现这些功能的,我们只需要知道怎么使用就可以了。这些程序设计模式和现实世界很像。一个庞大的程序就好似现实世界,就以Windows操作系统为例,这么一个庞大的操作系统不可能是由一个程序员完成的,而是由数百个程序员共同设计而成。程序员们各自实现自己的那个模块,根本不需要考虑其它程序员的代码是如何编写的。

转载于:https://www.cnblogs.com/0754ydj/archive/2008/07/23/1249160.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32——串口通信

STM32——串口通信 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、异步串口通信协议 STM32 的串口非常强大&#xff0c;它不仅支持最基本的通用串口同步、异步通信&#xff0c;还具有 LIN 总线功能&#xff08;局域互联网&#xff09;、IRDA 功能&…

操作系统——死锁(银行家算法)

1、概述 1.1 死锁 死锁是多个进程因竞争资源而造成的一种僵局&#xff08;互相等待&#xff09;&#xff0c;若无外力作用&#xff0c;这些进程都将无法向前推进。 1.2 死锁产生的原因和条件 原因&#xff1a;&#xff08;1&#xff09;竞争资源&#xff1b;&#xff08;2&…

操作系统——内存管理

1、内存基本概念 1.1 主要功能 内存空间的分配与回收&#xff1b;地址转换内存保护&#xff1a;使用上下限寄存器或者重定位寄存器和界地址寄存器内存扩充&#xff1a;交换和覆盖内容共享 2、内存的分配与回收 2.1 连续分配方式 连续分配方式是指为一个用户程序分配一个连续…

解决一个驱动代码解耦合问题

之前解决的项目LCD设备兼容问题&#xff0c;在 a.c 文件里面定义了一个变量&#xff0c;然后在 b.c 里面使用 extern声明引用这个变量&#xff0c;通过这种方法可以在b.c中使用在a.c 里面初始化的变量。但是这中情况就会引起一个问题&#xff0c;就是驱动代码之间耦合了&#x…

STM32——DMA

STM32——DMA 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 DMA 是为CPU分担数据转移的工作。因为DMA的存在CPU才被解放出来&#xff0c;它可以在 DMA 转移数据的过程中同时进行数据运算、响应中断&#xff0c;大大提高效率。 1、DMA工作分析 数据传…

YOLOv8改进 | 主干篇 | 利用SENetV1改进网络结构 (ILSVRC冠军得主)

一、本文介绍 本文给大家带来的改进机制是SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何一个模型相结合的模块(可以看作是一…

搭建Servlet在线视频

这个视频flash上传及在线播放&#xff0c;搞了我一天了&#xff0c;总算有点成果&#xff0c;但还有一些疑问没有解决&#xff0c;现在发这篇随笔&#xff0c;为的就是交流视频在线上传和观看的一些问题。 在线编辑器使用FCKEditor&#xff0c;首先是修改FCKEditor的配置文件&a…

操作系统——内存管理例题

1、关于分配策略例题 case1&#xff1a;某系统的空闲分区见下表&#xff0c;如有下列作业&#xff1a;96KB&#xff0c;20KB&#xff0c;200KB&#xff0c;分别采用首次适应算法和最佳适应算法来处理这些作业序列&#xff0c;哪种算法能满足该作业序列请求&#xff1f; 分区号…

STM32中C语言知识点:初学者必看,老鸟复习(长文总结)

说在前面的话一位初学单片机的小伙伴让我推荐C语言书籍&#xff0c;因为C语言基础比较差&#xff0c;想把C语言重新学一遍&#xff0c;再去学单片机&#xff0c;我以前刚学单片机的时候也有这样子的想法。其实C语言是可以边学单片机边学的&#xff0c;学单片机的一些例程中&…

STM32——ADC

STM32——ADC 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、ADC指标 有 18 个通道&#xff0c;可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行 &#xff1b;ADC的结果可以左对齐或右对齐方式存储在 16…

时间复杂度和空间复杂度,一看就懂,面试前必过一遍

一、定义时间和空间是程序的一个硬性指标&#xff0c;一个用来衡量 代码执行的速度 &#xff0c;一个用来衡量 存储空间的大小程序 数据结构 算法时间复杂度&#xff1a;就是执行程序的快慢&#xff0c;速度越快&#xff0c;时间复杂度就越好。空间复杂度&#xff1a;就是执…

数据结构——排序【仅用于考试】

1、简介 排序&#xff0c;是重新排列表中的元素&#xff0c;使表中的元素满足按关键字有序的过程 稳定性&#xff1a;选取两个元素Ri<Rj&#xff0c;经过排序算法之后&#xff0c;仍为Ri<Rj 不稳定的排序&#xff1a;【简单选择排序&#xff0c;快速排序&#xff0c;堆…

[UWP]做个调皮的BusyIndicator

1. 前言 最近突然想要个BusyIndicator。做过WPF开发的程序员对BusyIndicator应该不陌生&#xff0c;Extended WPF Toolkit 提供了BusyIndicator的开源实现&#xff0c;Silverlight Toolkit也有一个&#xff0c;这次想要把这个控件移植到UWP中。 2. 先说点正经的 2.1 BusyIndica…

STM32——I2C

STM32——I2C 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、I2C协议 I 2 C &#xff08;Inter-Integrated Circuit&#xff09;协议是由 Philips 公司开发的&#xff0c;由于它具备引脚少、硬件实现简单、可扩展性强、不需要如 USART、CAN 的外部…

C语言发展简史

1、起源C 语言最早的原型是 ALGOL 60 1963 年&#xff0c;剑桥大学将其发展成为 CPL(Combined Programing Language)。1967 年&#xff0c;剑桥大学的 Matin Richards 对 CPL 语言进行了简化&#xff0c;产生了 BCPL 语言。1970 年&#xff0c;美国贝尔实验室(Bell Labs)的 Ken…

STM32——EEPROM

STM32——EEPROM 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、I2C接口读写EEPROM&#xff08;AT24C02&#xff09; ——主模式&#xff0c;分别用作主发送器和主接收器。通过查询事件的方式来确保正常通信。 1、I 2C接口初始化 与其他对GPIO 复用…

Linus Torvalds谈ECC内存的重要性 痛斥英特尔正在扼杀它

新年假期&#xff0c;Linus Torvalds在邮件列表中发表的一篇火热的帖子引发技术社区关注&#xff0c;人们借此讨论ECC内存的重要性&#xff0c;Torvalds在文章中抨击了英特尔在这方面的”坏政策”&#xff0c;因为特定的市场细分使ECC内存不那么普及。Linus认为&#xff0c;纠错…

加密和解密算法的兩個實現

最近一段時間,集團加強了資安方面的管理,所有敏感的配置字節都必須經過加密處理,把最近用到的幾個加解密類整理了一下,以做備忘. 其實這兩個類實現的方法差不多,只是有些細微區別: 對稱加密演算法類 SymmetricMethodHelperusing System;using System.IO;using System.Security.…

47.leetcode36_valid_suduko

1.题目分析 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character .. A partially filled sudoku which is valid. Note: A valid Sudoku board (partia…