3.5.2 冒泡排序类
生活随笔
收集整理的這篇文章主要介紹了
3.5.2 冒泡排序类
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
那么,我們就以冒泡排序?yàn)槔?#xff0c;把它改造成一個(gè)類。首先,單擊菜單,“項(xiàng)目”-“添加類”,添加一個(gè)BubbleSort.cs類文件。IDE自動(dòng)為我們創(chuàng)建如下代碼: using?System;
using?System.Collections.Generic;
using?System.Text;
namespace?Chapter35
{
????class?BubbleSort
????{
????}
}
using?System.Collections.Generic;
using?System.Text;
namespace?Chapter3
{
????enum?SortType
????{
????????ASC,??//正序?A-Z
????????DESC??//到序?Z-A
????}
????class?BubbleSort
????{
????????#?region?字段
????????//?表示排序類型的私有字段
????????private?SortType?order;
????????//?表示排序數(shù)組的私有字段
????????private?int[]?list;
????????//?表示迭代次數(shù)的私有字段
????????private?int?iterateCount;
????????#?endregion
????????#?region?屬性
????????//?表示排序類型的屬性,可讀可寫(xiě)
????????public?SortType?Order
????????{
????????????get?{?return?order;?}
????????????set?{?order?=?value;?}
????????}
????????//?表示排序數(shù)組的屬性,可讀可寫(xiě)
????????public?int[]?List
????????{
????????????get?{?return?list;?}
????????????set?{?list?=?value;?}
????????}
????????//?表示迭代次數(shù)的屬性,只讀
????????public?int?IterateCount
????????{
????????????get?{?return?iterateCount;?}
????????}
????????#?endregion
????????#?region?構(gòu)造方法
????????//?沒(méi)有任何參數(shù)的構(gòu)造方法
????????public?BubbleSort()
????????{
????????????order?=?SortType.ASC;
????????}
????????//?帶有一個(gè)參數(shù)的重載構(gòu)造方法
????????public?BubbleSort(int[]?arr)
????????{
????????????list?=?arr;
????????????order?=?SortType.ASC;
????????}
????????//?帶有兩個(gè)參數(shù)的重載構(gòu)造方法
????????public?BubbleSort(int[]?arr,?SortType?type)
????????{
????????????list?=?arr;
????????????order?=?type;
????????}
????????#?endregion
????????#?region?私有方法
????????//?用于交換兩個(gè)變量私有方法
????????private?void?Swap(ref?int?a,?ref?int?b)
????????{
????????????int?c?=?a;
????????????a?=?b;
????????????b?=?c;
????????}
????????#?endregion
????????#?region?公有方法
????????//?用于排序操作的公有方法
????????public?void?Sort()
????????{
????????????bool?isOK?=?false;
????????????iterateCount?=?0;
????????????while?(!isOK)
????????????{
????????????????isOK?=?true;
????????????????for?(int?i?=?0;?i?<?list.Length?-?1;?i++)
????????????????{
????????????????????iterateCount++;
????????????????????switch?(order)
????????????????????{
????????????????????????case?SortType.ASC:
????????????????????????????{
????????????????????????????????if?(list[i]?>?list[i?+?1])
????????????????????????????????{
????????????????????????????????????Swap(ref?list[i],?ref?list[i?+?1]);
????????????????????????????????????isOK?=?false;
????????????????????????????????}
????????????????????????????????break;
????????????????????????????}
????????????????????????case?SortType.DESC:
????????????????????????????{
????????????????????????????????if?(list[i]?<?list[i?+?1])
????????????????????????????????{
????????????????????????????????????Swap(ref?list[i],?ref?list[i?+?1]);
????????????????????????????????????isOK?=?false;
????????????????????????????????}
????????????????????????????????break;
????????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
????????//?用于把字符數(shù)組轉(zhuǎn)化為字符串的公有方法
????????public?string?GetDataString()
????????{
????????????StringBuilder?sb?=?new?StringBuilder();
????????????for?(int?i?=?0;?i?<?list.Length;?i++)
????????????????sb.Append(list[i]);
????????????return?sb.ToString();
????????}
????????//?用于把字符數(shù)組轉(zhuǎn)化為字符串的公有重載方法,接受一個(gè)字符串參數(shù)作為分割符
????????public?string?GetDataString(string?separator)
????????{
????????????StringBuilder?sb?=?new?StringBuilder();
????????????for?(int?i?=?0;?i?<?list.Length;?i++)
????????????{
????????????????sb.Append(list[i]);
????????????????sb.Append(separator);
????????????}
????????????sb.Remove(sb.Length?-?separator.Length,?separator.Length);
????????????return?sb.ToString();
????????}
????????#?endregion
????}
}
調(diào)用類的代碼如下: int[]?list1?=?{?1,?0,?6,?5,?7,?9,?2,?8,?3,?4?};
BubbleSort?sort?=?new?BubbleSort(list1);
Console.WriteLine("排序前:?"?+?sort.GetDataString());
sort.Sort();
Console.WriteLine("迭代次數(shù):?"?+?sort.IterateCount);
Console.WriteLine("排序后:?"?+?sort.GetDataString());
Console.WriteLine("---------------------分割符---------------------");
int[]?list2?=?{?7,?6,?9,?8,?5,?3,?4,?2,?1,?0?};
sort.List?=?list2;
Console.WriteLine("排序前:?"?+?sort.GetDataString());
sort.Order?=?SortType.DESC;
sort.Sort();
Console.WriteLine("迭代次數(shù):?"?+?sort.IterateCount);
Console.WriteLine("排序后:?"?+?sort.GetDataString("->"));
不去看代碼,從運(yùn)行后的效果可以看出這個(gè) BubbleSort 類相比先前做的例子有以下改進(jìn):
·支持從小到大、從大到小兩種排序類型。
·支持自定義輸出的分割符,比如“->”。
·可以知道排序的迭代次數(shù)。
假設(shè)冒泡排序類是別人寫(xiě)的,我們先來(lái)看一下調(diào)用的代碼熟悉.NET下對(duì)象使用:
1. 第一行代碼聲明了一個(gè)整數(shù)數(shù)組用于排序。
2. 第二行代碼實(shí)例化了一個(gè) BubbleSort 類。前面提到過(guò),類是一個(gè)抽象的東西,要為我們所用就需要先得到一個(gè)實(shí)例。就好比我們先要買一個(gè)真正的房子然后才能居住。BubbleSort sort = new BubbleSort(list1); 在實(shí)例化的時(shí)候把排序數(shù)組直接賦值給類的構(gòu)造方法,然后得到的實(shí)例為 sort。構(gòu)造方法可以理解為一個(gè)初始化方法。
3. 第三行代碼調(diào)用了 BubbleSort 的 GetDataString()方法。GetDataString()方法返回一個(gè)字符串表示數(shù)組的內(nèi)容。方法可以理解為一個(gè)具有某種操作的功能,可以接受一些參數(shù)并返回一個(gè)值,在這里的GetDataString()方法返回一個(gè)字符串。
4. 第4行代碼調(diào)用了 BubbleSort 的 Sort() 方法進(jìn)行排序操作。 Sort()方法不返回任何值。
5. 第5行代碼輸出 BubbleSort 的 IterateCount 屬性的值,它表示某次排序操作的迭代(循環(huán))次數(shù)。
6. 第6行代碼再次調(diào)用 BubbleSort 的 GetDataString() 方法輸出排序后的數(shù)組。
7. 第7行代碼輸出了一行分割符,用于再一次的反向排序。
8. 第8行代碼聲明了另外一個(gè)整數(shù)數(shù)組用于排序。
9. 第9行代碼重新設(shè)置了 BubbleSort 的 List 屬性為新的數(shù)組
10. 第10行代碼調(diào)用了 BubbleSort 的 GetDataString()方法輸出排序前的數(shù)組。
11. 第11行代碼設(shè)置 BubbleSort 的 Order 屬性為 SortType.DESC,表示排序方式使用倒序。Order性中的類型是SortType枚舉。鼠標(biāo)停留在Order字段上,IDE顯示了屬性的類型。
12. 第12行代碼再次調(diào)用 BubbleSort 的 Sort() 方法進(jìn)行排序操作。
13. 第13行代碼輸出迭代次數(shù)。
14. 第14行代碼再次調(diào)用了BubbleSort的GetDataString()方法輸出拓序后的數(shù)組。和上次排序不同,這里我們?yōu)镚etDataString()賦值了一個(gè)分割符,數(shù)組的每個(gè)元素都使用“->”進(jìn)行分割。你可能會(huì)奇怪,我們調(diào)用的都是GetDataString()方法,怎么一次可以使用參數(shù)一次又不可以使用參數(shù)?這個(gè)問(wèn)題暫留著稍后回答。
BubbleSort 類的確工作得很好,我們并不需要知道它是怎么實(shí)現(xiàn)這些功能的,我們只需要知道怎么使用就可以了。這些程序設(shè)計(jì)模式和現(xiàn)實(shí)世界很像。一個(gè)龐大的程序就好似現(xiàn)實(shí)世界,就以Windows操作系統(tǒng)為例,這么一個(gè)龐大的操作系統(tǒng)不可能是由一個(gè)程序員完成的,而是由數(shù)百個(gè)程序員共同設(shè)計(jì)而成。程序員們各自實(shí)現(xiàn)自己的那個(gè)模塊,根本不需要考慮其它程序員的代碼是如何編寫(xiě)的。
using?System.Collections.Generic;
using?System.Text;
namespace?Chapter35
{
????class?BubbleSort
????{
????}
}
從這段代碼中我們可以知道:
·我們的類在Chapter35命名空間內(nèi),由于主程序也在這個(gè)命名空間內(nèi),不需要 using Chapter35 就可以直接使用 BubbleSort 類。
·系統(tǒng)已經(jīng) using 了三個(gè)命名空間,可以直接使用這些命名空間里面的類型。
?
在詳細(xì)介紹類以及類的各種成員以前,我想先讓大家看完整的 BubbleSort.cs代碼,這是一典型的類,你可能會(huì)驚訝和先前的排序代碼相比面目全非。
using?System;using?System.Collections.Generic;
using?System.Text;
namespace?Chapter3
{
????enum?SortType
????{
????????ASC,??//正序?A-Z
????????DESC??//到序?Z-A
????}
????class?BubbleSort
????{
????????#?region?字段
????????//?表示排序類型的私有字段
????????private?SortType?order;
????????//?表示排序數(shù)組的私有字段
????????private?int[]?list;
????????//?表示迭代次數(shù)的私有字段
????????private?int?iterateCount;
????????#?endregion
????????#?region?屬性
????????//?表示排序類型的屬性,可讀可寫(xiě)
????????public?SortType?Order
????????{
????????????get?{?return?order;?}
????????????set?{?order?=?value;?}
????????}
????????//?表示排序數(shù)組的屬性,可讀可寫(xiě)
????????public?int[]?List
????????{
????????????get?{?return?list;?}
????????????set?{?list?=?value;?}
????????}
????????//?表示迭代次數(shù)的屬性,只讀
????????public?int?IterateCount
????????{
????????????get?{?return?iterateCount;?}
????????}
????????#?endregion
????????#?region?構(gòu)造方法
????????//?沒(méi)有任何參數(shù)的構(gòu)造方法
????????public?BubbleSort()
????????{
????????????order?=?SortType.ASC;
????????}
????????//?帶有一個(gè)參數(shù)的重載構(gòu)造方法
????????public?BubbleSort(int[]?arr)
????????{
????????????list?=?arr;
????????????order?=?SortType.ASC;
????????}
????????//?帶有兩個(gè)參數(shù)的重載構(gòu)造方法
????????public?BubbleSort(int[]?arr,?SortType?type)
????????{
????????????list?=?arr;
????????????order?=?type;
????????}
????????#?endregion
????????#?region?私有方法
????????//?用于交換兩個(gè)變量私有方法
????????private?void?Swap(ref?int?a,?ref?int?b)
????????{
????????????int?c?=?a;
????????????a?=?b;
????????????b?=?c;
????????}
????????#?endregion
????????#?region?公有方法
????????//?用于排序操作的公有方法
????????public?void?Sort()
????????{
????????????bool?isOK?=?false;
????????????iterateCount?=?0;
????????????while?(!isOK)
????????????{
????????????????isOK?=?true;
????????????????for?(int?i?=?0;?i?<?list.Length?-?1;?i++)
????????????????{
????????????????????iterateCount++;
????????????????????switch?(order)
????????????????????{
????????????????????????case?SortType.ASC:
????????????????????????????{
????????????????????????????????if?(list[i]?>?list[i?+?1])
????????????????????????????????{
????????????????????????????????????Swap(ref?list[i],?ref?list[i?+?1]);
????????????????????????????????????isOK?=?false;
????????????????????????????????}
????????????????????????????????break;
????????????????????????????}
????????????????????????case?SortType.DESC:
????????????????????????????{
????????????????????????????????if?(list[i]?<?list[i?+?1])
????????????????????????????????{
????????????????????????????????????Swap(ref?list[i],?ref?list[i?+?1]);
????????????????????????????????????isOK?=?false;
????????????????????????????????}
????????????????????????????????break;
????????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
????????//?用于把字符數(shù)組轉(zhuǎn)化為字符串的公有方法
????????public?string?GetDataString()
????????{
????????????StringBuilder?sb?=?new?StringBuilder();
????????????for?(int?i?=?0;?i?<?list.Length;?i++)
????????????????sb.Append(list[i]);
????????????return?sb.ToString();
????????}
????????//?用于把字符數(shù)組轉(zhuǎn)化為字符串的公有重載方法,接受一個(gè)字符串參數(shù)作為分割符
????????public?string?GetDataString(string?separator)
????????{
????????????StringBuilder?sb?=?new?StringBuilder();
????????????for?(int?i?=?0;?i?<?list.Length;?i++)
????????????{
????????????????sb.Append(list[i]);
????????????????sb.Append(separator);
????????????}
????????????sb.Remove(sb.Length?-?separator.Length,?separator.Length);
????????????return?sb.ToString();
????????}
????????#?endregion
????}
}
調(diào)用類的代碼如下: int[]?list1?=?{?1,?0,?6,?5,?7,?9,?2,?8,?3,?4?};
BubbleSort?sort?=?new?BubbleSort(list1);
Console.WriteLine("排序前:?"?+?sort.GetDataString());
sort.Sort();
Console.WriteLine("迭代次數(shù):?"?+?sort.IterateCount);
Console.WriteLine("排序后:?"?+?sort.GetDataString());
Console.WriteLine("---------------------分割符---------------------");
int[]?list2?=?{?7,?6,?9,?8,?5,?3,?4,?2,?1,?0?};
sort.List?=?list2;
Console.WriteLine("排序前:?"?+?sort.GetDataString());
sort.Order?=?SortType.DESC;
sort.Sort();
Console.WriteLine("迭代次數(shù):?"?+?sort.IterateCount);
Console.WriteLine("排序后:?"?+?sort.GetDataString("->"));
不去看代碼,從運(yùn)行后的效果可以看出這個(gè) BubbleSort 類相比先前做的例子有以下改進(jìn):
·支持從小到大、從大到小兩種排序類型。
·支持自定義輸出的分割符,比如“->”。
·可以知道排序的迭代次數(shù)。
假設(shè)冒泡排序類是別人寫(xiě)的,我們先來(lái)看一下調(diào)用的代碼熟悉.NET下對(duì)象使用:
1. 第一行代碼聲明了一個(gè)整數(shù)數(shù)組用于排序。
2. 第二行代碼實(shí)例化了一個(gè) BubbleSort 類。前面提到過(guò),類是一個(gè)抽象的東西,要為我們所用就需要先得到一個(gè)實(shí)例。就好比我們先要買一個(gè)真正的房子然后才能居住。BubbleSort sort = new BubbleSort(list1); 在實(shí)例化的時(shí)候把排序數(shù)組直接賦值給類的構(gòu)造方法,然后得到的實(shí)例為 sort。構(gòu)造方法可以理解為一個(gè)初始化方法。
3. 第三行代碼調(diào)用了 BubbleSort 的 GetDataString()方法。GetDataString()方法返回一個(gè)字符串表示數(shù)組的內(nèi)容。方法可以理解為一個(gè)具有某種操作的功能,可以接受一些參數(shù)并返回一個(gè)值,在這里的GetDataString()方法返回一個(gè)字符串。
4. 第4行代碼調(diào)用了 BubbleSort 的 Sort() 方法進(jìn)行排序操作。 Sort()方法不返回任何值。
5. 第5行代碼輸出 BubbleSort 的 IterateCount 屬性的值,它表示某次排序操作的迭代(循環(huán))次數(shù)。
6. 第6行代碼再次調(diào)用 BubbleSort 的 GetDataString() 方法輸出排序后的數(shù)組。
7. 第7行代碼輸出了一行分割符,用于再一次的反向排序。
8. 第8行代碼聲明了另外一個(gè)整數(shù)數(shù)組用于排序。
9. 第9行代碼重新設(shè)置了 BubbleSort 的 List 屬性為新的數(shù)組
10. 第10行代碼調(diào)用了 BubbleSort 的 GetDataString()方法輸出排序前的數(shù)組。
11. 第11行代碼設(shè)置 BubbleSort 的 Order 屬性為 SortType.DESC,表示排序方式使用倒序。Order性中的類型是SortType枚舉。鼠標(biāo)停留在Order字段上,IDE顯示了屬性的類型。
12. 第12行代碼再次調(diào)用 BubbleSort 的 Sort() 方法進(jìn)行排序操作。
13. 第13行代碼輸出迭代次數(shù)。
14. 第14行代碼再次調(diào)用了BubbleSort的GetDataString()方法輸出拓序后的數(shù)組。和上次排序不同,這里我們?yōu)镚etDataString()賦值了一個(gè)分割符,數(shù)組的每個(gè)元素都使用“->”進(jìn)行分割。你可能會(huì)奇怪,我們調(diào)用的都是GetDataString()方法,怎么一次可以使用參數(shù)一次又不可以使用參數(shù)?這個(gè)問(wèn)題暫留著稍后回答。
BubbleSort 類的確工作得很好,我們并不需要知道它是怎么實(shí)現(xiàn)這些功能的,我們只需要知道怎么使用就可以了。這些程序設(shè)計(jì)模式和現(xiàn)實(shí)世界很像。一個(gè)龐大的程序就好似現(xiàn)實(shí)世界,就以Windows操作系統(tǒng)為例,這么一個(gè)龐大的操作系統(tǒng)不可能是由一個(gè)程序員完成的,而是由數(shù)百個(gè)程序員共同設(shè)計(jì)而成。程序員們各自實(shí)現(xiàn)自己的那個(gè)模塊,根本不需要考慮其它程序員的代碼是如何編寫(xiě)的。
轉(zhuǎn)載于:https://www.cnblogs.com/0754ydj/archive/2008/07/23/1249160.html
總結(jié)
以上是生活随笔為你收集整理的3.5.2 冒泡排序类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新学年开始了
- 下一篇: 【乡音】海安话四级考试