3.5.2 冒泡排序类
生活随笔
收集整理的這篇文章主要介紹了
3.5.2 冒泡排序类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
那么,我們就以冒泡排序為例,把它改造成一個類。首先,單擊菜單,“項目”-“添加類”,添加一個BubbleSort.cs類文件。IDE自動為我們創建如下代碼: 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;
????????//?表示排序數組的私有字段
????????private?int[]?list;
????????//?表示迭代次數的私有字段
????????private?int?iterateCount;
????????#?endregion
????????#?region?屬性
????????//?表示排序類型的屬性,可讀可寫
????????public?SortType?Order
????????{
????????????get?{?return?order;?}
????????????set?{?order?=?value;?}
????????}
????????//?表示排序數組的屬性,可讀可寫
????????public?int[]?List
????????{
????????????get?{?return?list;?}
????????????set?{?list?=?value;?}
????????}
????????//?表示迭代次數的屬性,只讀
????????public?int?IterateCount
????????{
????????????get?{?return?iterateCount;?}
????????}
????????#?endregion
????????#?region?構造方法
????????//?沒有任何參數的構造方法
????????public?BubbleSort()
????????{
????????????order?=?SortType.ASC;
????????}
????????//?帶有一個參數的重載構造方法
????????public?BubbleSort(int[]?arr)
????????{
????????????list?=?arr;
????????????order?=?SortType.ASC;
????????}
????????//?帶有兩個參數的重載構造方法
????????public?BubbleSort(int[]?arr,?SortType?type)
????????{
????????????list?=?arr;
????????????order?=?type;
????????}
????????#?endregion
????????#?region?私有方法
????????//?用于交換兩個變量私有方法
????????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;
????????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
????????//?用于把字符數組轉化為字符串的公有方法
????????public?string?GetDataString()
????????{
????????????StringBuilder?sb?=?new?StringBuilder();
????????????for?(int?i?=?0;?i?<?list.Length;?i++)
????????????????sb.Append(list[i]);
????????????return?sb.ToString();
????????}
????????//?用于把字符數組轉化為字符串的公有重載方法,接受一個字符串參數作為分割符
????????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
????}
}
調用類的代碼如下: 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("迭代次數:?"?+?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("迭代次數:?"?+?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操作系統為例,這么一個龐大的操作系統不可能是由一個程序員完成的,而是由數百個程序員共同設計而成。程序員們各自實現自己的那個模塊,根本不需要考慮其它程序員的代碼是如何編寫的。
using?System.Collections.Generic;
using?System.Text;
namespace?Chapter35
{
????class?BubbleSort
????{
????}
}
從這段代碼中我們可以知道:
·我們的類在Chapter35命名空間內,由于主程序也在這個命名空間內,不需要 using Chapter35 就可以直接使用 BubbleSort 類。
·系統已經 using 了三個命名空間,可以直接使用這些命名空間里面的類型。
?
在詳細介紹類以及類的各種成員以前,我想先讓大家看完整的 BubbleSort.cs代碼,這是一典型的類,你可能會驚訝和先前的排序代碼相比面目全非。
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;
????????//?表示排序數組的私有字段
????????private?int[]?list;
????????//?表示迭代次數的私有字段
????????private?int?iterateCount;
????????#?endregion
????????#?region?屬性
????????//?表示排序類型的屬性,可讀可寫
????????public?SortType?Order
????????{
????????????get?{?return?order;?}
????????????set?{?order?=?value;?}
????????}
????????//?表示排序數組的屬性,可讀可寫
????????public?int[]?List
????????{
????????????get?{?return?list;?}
????????????set?{?list?=?value;?}
????????}
????????//?表示迭代次數的屬性,只讀
????????public?int?IterateCount
????????{
????????????get?{?return?iterateCount;?}
????????}
????????#?endregion
????????#?region?構造方法
????????//?沒有任何參數的構造方法
????????public?BubbleSort()
????????{
????????????order?=?SortType.ASC;
????????}
????????//?帶有一個參數的重載構造方法
????????public?BubbleSort(int[]?arr)
????????{
????????????list?=?arr;
????????????order?=?SortType.ASC;
????????}
????????//?帶有兩個參數的重載構造方法
????????public?BubbleSort(int[]?arr,?SortType?type)
????????{
????????????list?=?arr;
????????????order?=?type;
????????}
????????#?endregion
????????#?region?私有方法
????????//?用于交換兩個變量私有方法
????????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;
????????????????????????????}
????????????????????}
????????????????}
????????????}
????????}
????????//?用于把字符數組轉化為字符串的公有方法
????????public?string?GetDataString()
????????{
????????????StringBuilder?sb?=?new?StringBuilder();
????????????for?(int?i?=?0;?i?<?list.Length;?i++)
????????????????sb.Append(list[i]);
????????????return?sb.ToString();
????????}
????????//?用于把字符數組轉化為字符串的公有重載方法,接受一個字符串參數作為分割符
????????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
????}
}
調用類的代碼如下: 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("迭代次數:?"?+?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("迭代次數:?"?+?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
總結
以上是生活随笔為你收集整理的3.5.2 冒泡排序类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新学年开始了
- 下一篇: 【乡音】海安话四级考试