C#编程之经典算法——排序(一)
2011-05-29 18:57
519 查看
冒泡排序(BubbleSort)
冒泡排序,是指计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。不过,一路、二路归并排序、不平衡二叉树排序的速度均比冒泡排序快,且具有稳定性,但速度不及堆排序、快速排序。冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数。
冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
冒泡排序示例:
冒泡排序,是指计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。不过,一路、二路归并排序、不平衡二叉树排序的速度均比冒泡排序快,且具有稳定性,但速度不及堆排序、快速排序。冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数。
冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
冒泡排序示例:
void Bubble(int[] arr) { int n = arr.Length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
void Bubble(Array array) { int len = array.Length; for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { object o1 = array.GetValue(j); object o2 = array.GetValue(j + 1); if (o1.GetType() != o2.GetType()) { throw new Exception(); } Type t = o1.GetType().GetInterface("IComparable",true); if (t != null) { int ret = ((IComparable)o1).CompareTo(o2); if (ret > 0) { object o = o1; array.SetValue(o2, j); array.SetValue(o, j + 1); } } else { switch (o1.GetType().Name.ToLower()) { case "int32": if ((Int32)o1 > (Int32)o2) { object o = o1; array.SetValue(o2, j); array.SetValue(o, j + 1); } break; case "int64": if ((Int64)o1 > (Int64)o2) { object o = o1; array.SetValue(o2, j); array.SetValue(o, j + 1); } break; case "double": if ((double)o1 > (double)o2) { object o = o1; array.SetValue(o2, j); array.SetValue(o, j + 1); } break; case "decimal": if ((decimal)o1 > (decimal)o2) { object o = o1; array.SetValue(o2, j); array.SetValue(o, j + 1); } break; case "single": if ((Single)o1 > (Single)o2) { object o = o1; array.SetValue(o2, j); array.SetValue(o, j + 1); } break; case "int16": if ((Int16)o1 > (Int16)o2) { object o = o1; array.SetValue(o2, j); array.SetValue(o, j + 1); } break; default: throw new Exception(); } } } } }
相关文章推荐
- C#编程之经典算法——排序(十)
- C#编程之经典算法——排序(四)
- C#编程之经典算法——排序(十一)
- C#编程之经典算法——排序(六)
- C#编程之经典算法——排序(八)
- C#编程之经典算法——排序(七)
- C#编程之经典算法——排序(二)
- C#编程之经典算法——排序(十二)
- C#编程之经典算法——排序(三)
- C#编程之经典算法——排序(五)
- C#编程之经典算法——排序(九)
- C#编程之经典算法——递归过程(二)
- MoreWindows 专注于Windows编程 白话经典算法系列之六 快速排序 快速搞定
- C#编程之经典算法——查找(三)
- C#编程之经典算法——递归过程(一)
- C#的四种排序--经典算法
- C#编程之经典算法——递归过程(三)
- C#编程之经典算法——查找(四)
- C#实现所有经典排序算法
- C#编程之经典算法——查找(五)