这篇文章介绍C#实现的几种最简单的排序方法:冒泡排序、选择排序、插入排序,并简单测试了一下性能。排序在编程中占有很重要的位置,一定程度上体现了编程的功底。虽然学习过一段时间,感觉这东西总是记不住,时间长了就忘了或者搞混了。搞混了问题还不大,忘了就比较严重了。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Console.WriteLine("冒泡排序:"); BubbleSort(); Console.WriteLine("插入排序:"); InsertSort(); Console.ReadLine(); } /// <summary> /// 冒泡排序 /// 外循环控制已排序部分的数量,内循环控制两两比较,交换元素位置 /// </summary> static void BubbleSort() { int numberOfLoop = 0; int[] intArr = new int[] { 3, 2, 1, 6, 4, 8, 7, 9, 0, 5 }; //未优化的冒泡排序 //for (int i = 0; i < intArr.Length - 1; i++) //{ // for (int j = 0; j < intArr.Length - i - 1; j++) // { // numberOfLoop++; // //两个数作比较,把小的排在前边,最大的就会走到最后 // if (intArr[j + 1] < intArr[j]) // { // int temp = intArr[j + 1]; // intArr[j + 1] = intArr[j]; // intArr[j] = temp; // } // } //} //优化后的冒泡排序 //判断本次排序是否进行过位置调换,如果没有说明不用排序了 for (int i = 0; i < intArr.Length - 1; i++) { bool flag = true; for (int j = 0; j < intArr.Length - i - 1; j++) { numberOfLoop++; //两个数作比较,把小的排在前边,最大的就会走到最后 if (intArr[j + 1] < intArr[j]) { int temp = intArr[j + 1]; intArr[j + 1] = intArr[j]; intArr[j] = temp; flag = false; } } if (flag) { break; } } DisplaySortResult(numberOfLoop, intArr); } /// <summary> /// 选择排序 /// </summary> static void SelectSort() { int numberOfLoop = 0; int[] intArr = new int[] { 0, 3, 2, 1, 6, 4, 7, 8, 9, 5 }; int min; for (int i = 0; i < intArr.Length-1; i++) { min = i; for (int j = i + 1; j < intArr.Length; j++) { numberOfLoop++; //获取最小的 if (intArr[min] > intArr[j]) { min = j; } } if (min != i) { //交换位置 int temp = intArr[i]; intArr[i] = intArr[min]; intArr[min] = temp; } } DisplaySortResult(numberOfLoop, intArr); } /// <summary> /// 直接插入排序 /// 复杂度不是固定的,逆序越多,复杂度越高 /// </summary> static void InsertSort() { int numberOfLoop = 0; int[] intArr = new int[] { 3, 2, 1, 6, 4, 8, 7, 9, 0, 5 }; for (int i = 1; i < intArr.Length; i++) { //处理第i个数,i之前的数字排列是有序的 int j; int temp = intArr[i]; //包含第i个数的前序列 for (j = i; j > 0; j--) { numberOfLoop++; //比较第i个数与第j-1个数,如果第i个数小于第j-1个数,则i应该排在j-1的前边,将第j-1个数后移 //这样j-1的位置就是一个可以插入的位置,然后继续比较j-1前边的数,如果仍旧大于第i个数,则继续后移 //最后剩下一个位置,插入第i个数,这样包含i的前部分的序列就是有序的了。 if (intArr[j - 1] > temp) { intArr[j] = intArr[j - 1]; } else { break; } } //最后一个位置设置成要排序数 intArr[j] = temp; } DisplaySortResult(numberOfLoop, intArr); } /// <summary> /// 显示排序结果 /// </summary> /// <param name="numberOfLoop"></param> /// <param name="intArr"></param> private static void DisplaySortResult(int numberOfLoop, int[] intArr) { foreach (int i in intArr) { Console.Write(i.ToString() + ","); } Console.WriteLine(""); Console.WriteLine(numberOfLoop.ToString()); } } }
这篇文章用C#实现了几种基本的数据排序方式,这几种排序方式比较容易理解。下边是我做的测试:
1、20000个随机数测试
2、20000个随机字符测试
从上边的数据看选择排序执行交换的次数最少,插入排序执行比较的次数最少。插入排序用的时间最少,其次是选择排序,鸡尾酒排序,冒泡排序。没有经过大范围的验证,不保证每次都这样。
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论