转:C#数据结构和算法学习系列四----基础排序算法
在计算机中实现存储数据最普遍的两种操作就是排序和 查找。这是从计算机产业初始就已经确认的了。这意味着排序和查找也是计算机科学领域最值得研究的两种操作。这些简单算法就是插入排序算法、冒泡排序算法以 及选择排序算法。这些算法的每一种都很容易理解和实现。对于任意情况而言这些算法不是最好的全面算法,但是对于少量数据集合或者其他特殊情况而言,它们是 可用的最好算法。
1.冒泡排序。冒泡排序是可用的最慢排序算法之一,但是它也是最容易理解和实现的排序 算法之一。这种排序算法的得名是由于数值“像气泡一样”从序列的一端浮动到另一端。假设现在要把一列数按升序方式进行排序,即较大数值浮动到列的右侧,而 较小数值则浮动到列的左侧。这种效果可以通过下列操作来实现:多次遍历整个列,并且比较相邻的数值,如果左侧的数值大于右侧数值就进行交换。
- public void BubbleSort()
- {
- int temp;
- for (int outer = upper; outer >= 1; outer--)
- {
- for (int inner = 0; inner <= outer - 1; inner++)
- {
- if ((int)arr[inner] > arr[inner + 1])
- {
- emp = arr[inner];
- arr[inner] = arr[inner + 1];
- arr[inner + 1] = temp;
- }
- }
- }
- }
2.选择排序。这种排序是从数组的起始处开始,把第一个元素与数组中其他元素进行比 较。然后,将最小的元素放置在第0 个位置上,接着再从第1 个位置开始再次进行排序操作。这种操作会一直到除最后一个元素外的每一个元素都作为新循环的起始点操作过后才终止。在选择排序算法中使用了两层循环。外层 循环从数组的第一个元素移动到数组最后一个元素之前的元素,而内层循环则从数组的第二个元素移动到数组的最后一个元素,并且查找比当前外层循环所指元素更 小的数值。在内循环遍历一遍之后,就会把数组内最小值赋值到数组中合适的位置上。
- public void SelectionSort()
- {
- int min, temp;
- for (int outer = 0; outer <= upper; outer++)
- {
- min = outer;
- for (int inner = outer + 1; inner <= upper; inner++)
- {
- if (arr[inner] < arr[min]) min = inner;
- }
- temp = arr[outer];
- arr[outer] = arr[min];
- arr[min] = temp;
- }
- }
3.插入排序.插入排序算法类似于人们通常按照数字顺序或者字母顺序进行排序的方法。 假如我要求全班同学上交填有本人姓名、学号以及简短自我介绍的索引卡片。而学生们交回来的卡片是随机.排列的。如果要把卡片按照字母排序排列,就可以构建 出一张座次表了。插入排序算法有两层循环。外层循环会逐个遍历数组元素,而内层循环则会把外层循环所选择的元素与该元素在数组内的下一个元素进行比较。如 果外层循环选择的元素小于内层循环选择的元素,那么数组元素都向右移以便为内层循环元素留出位置。
- public void InsertionSort()
- {
- int inner, temp;
- for (int outer = 1; outer <= upper; outer++)
- {
- temp = arr[outer];
- inner = outer;
- while (inner > 0 && arr[inner - 1] >= temp)
- {
- arr[inner] = arr[inner - 1];
- inner -= 1;
- }
- arr[inner] = temp;
- }
- }
上述三种排序算法在复杂度和理论上都是十分相似的,所以在互相进行比较的时候应该操作近似。(测试方法略)选择排序和冒泡排序的执行效率相等,而插入排 序的速度则是其他两种算法速度的一半(或者说是比其他算法慢两倍的时间)。当数组元素量为1000 时,选择排序比冒泡排序快了100多倍,而且选择排序比插入排序快了200 多倍。当数组元素量增加到10000 个的时候,确实能看出数组大小对三种排序算法的影响。尽管选择排序始终比其他两种算法快出许多倍,但是所有这三种排序算法的性能还是相当低的。准确地说, 这些算法没有一种在对庞大数据集合进行排序时是理想选择。但是存在能高效处理庞大数据集合的排序算法。