交换排序,插入排序和选择排序都是很简单也很基础的排序算法。在世面上各种各样的算法和数据结构的书中都很轻易地找的到他们的踪影。在这儿写出来不外乎是加深自己的印象,也为有需要的朋友做一个参考。
1 交换排序
交换排序是一种很简单的排序方法。其主要思想如下:
(1)利用要排序范围中的第0个数据d[i]与范围中其它数据d[j]相比较。如果前面的数据比后面大,那么就交换这两个数据(就是把较小的数据放在第0个位置)。然后再和排序范围内下一个数据d[j+1]相比较。依此类推。
(2)当执行完步骤(1)后,最小值即位于范围中的第0个位置。然后在剩下的数据中找到一个最小的,放在第1个位置,这样循环查找下去直到所有数据结束,最后可以得到由小到大的排序结果。
交换排序的思想和冒泡排序的思想很类似,实现的代码也非常相似。下面是一个简单的说明例子。
假设要排序的数据是:6 2 5 1 3 4
步骤一:
因为6>2,所以2和6交换
2 6 5 1 3 4
步骤二:因为2<5,所以不交换
2 6 5 1 3 4
步骤三:因为2>1,所以交换
1 6 5 2 3 4
步骤四:因为1<3,所以不交换
1 6 5 2 3 4
步骤五:因为1<4,所以不交换
1 6 5 2 3 4
这样我们叫找到了最小值1,按照同样的办法,就可以找到第二个,第三个最小值。。完成排序。
实现代码非常简单,如下所示:
/// <summary>
/// 交换排序的思想非常简单,从第一个数据开始,在剩下的数据中找
/// 比它小的数据,如果找到了,就交换两者。
/// 第一次查找可以找到最小的数据,和第0个数据交换
/// 第二次在剩下的n-1个数据中查找,找个最小的和第一个数据交换
/// 依次交换剩下的所有数据使之有序
/// </summary>
/// <param name="myArray"></param>
public static void ExchangeSort(int [] myArray)
{
int i, j;
for(i=0; i<myArray.Length-1; i++) //从第0个数据开始
{
for(j=i+1; j<myArray.Length; j++)//在剩下的数据中循环
{
if(myArray[j] < myArray[i]) //如果有比它小的,交换两者
{
Swap(ref myArray[j], ref myArray[i]);
}
}
}
}
2 选择排序
选择排序也是很简单的排序方法之一。其主要思想如下:
(1)第一次在数组中查找出最小的值a[i],将其和第0个位置交换。
(2)此时剩下n-1个值,同样从中找出最小的值a[j],a[j]和第一个数据交换
(3)重复上面的步骤,在剩下的范围中找出最小的值和最小数组下标的值进行交换。
一般会设置一个额外变量small来记录最小值的下标,以便于在循环之后,交换指定位置和最小值位置的值。根据上面的描述,我们可以很容易地就写出选择排序的算法。
/// <summary>
/// 选择排序的中心思想是每次都从未排序的数据中选出最小的数据,
/// 和未排序数据的第一个数据交换。
/// 第一次选出最小的数据放在第0个位置
/// 第二次在剩下的n-1个数据中选出最小的数据放在第一个位置
/// 依次下去,将所有数据排序
/// </summary>
/// <param name="myArray"></param>
public static void SelectSort(int [] myArray)
{
int i, j, small;
for(i=0; i<myArray.Length-1; i++) //数据起始位置,从0到倒数第二个数据
{
small = i; //记录最小数据的下标
for(j=i+1; j<myArray.Length; j++) //在剩下的数据中寻找最小数据
{
if(myArray[j] < myArray[small])
{
small = j; //如果有比它更小的,记录下标
}
}
Swap(ref myArray[i], ref myArray[small]); //将最小数据和未排序的第一个数据交换
}
}
3 插入排序
插入排序也是一种原理非常简单的排序方法,属于插入方法的排序。其主要思想如下:
(1)首先从第一个数据开始,将该值插入到其前面已经排好序的数据当中。插入的位置是第一个大于该数据的记录的前面。如果没有大于它的数据,就将其放在排好序的数据的最后。由于现在排序尚未开始,因此只有第1个元素。
(2)接着是第二个元素,用步骤1的方法插入到大于它的数的前面。现在第一个,第二个数据都是有序的了。
(3)依次可以排第三个,第四个数据,直到所有的数据完全排好序。可以从下面例子看出详细的过程。
还是假设要排序的数字为:6 2 5 1 3 4
步骤1:移动第一个
6 2 5 1 3 4
步骤2:移动第二个,因为2<6,所以将2放在6前面
2 6 5 1 3 4
步骤3:移动第三个,因为2<5<6,所以将5放在6前面
2 5 6 1 3 4
步骤4:移动第四个,因为1<2<5<6,所以将1放在最前面
1 2 5 6 3 4
步骤5:移动第五个,因为2<3<5<6,所以将3放在2后面
1 2 3 5 6 4
步骤6:移动第六个,因为3<4<5<6,所以将4将在3后面
1 2 3 4 5 6
这样所有的数据就都排好序了。
其实现的算法如下:
/// <summary>
/// 插入排序的中心思想在于将未排序的数据插入一个有序表中
/// 第一次将第一个数据放入一个有序表中,该有序表只有一个数据
/// 第二次将第二个数据插入有序表中,使之小的在前,大的在后
/// 第三次将第三个数据插入有序表中
/// 依次下去,将所有数据放入有序表中
/// </summary>
/// <param name="myArray"></param>
public static void InsertSort(int[] myArray)
{
int i, j, temp;
for(i=1; i<myArray.Length; i++)
{
temp = myArray[i]; //保存当前数据
j = i-1;
//将数据插入有序表中,如果表中的数据比该数据大,
//那么就依次向后移动有序表中的数据,直到找到第一个比它小的数据,
//将它放在那个数据后面
while(j>=0 && myArray[j]>temp)
{
myArray[j+1] = myArray[j];
j--;
}
myArray[j+1] = temp; //将数据插入有序表中
}
}
4 效率比较
在实现这三种算法以后,这三种算法都是O(n^2)的算法。效率并不高。还是做个小小的试验来验证一下效率,还是使用1+1中的随机数来测试,可以得到下表,看到这几种算法的效率区别。单位为毫秒
|
500随机数 |
5000随机数 |
20000随机数 |
基本冒泡 |
1.5625 |
160.9375 |
2457.8125 |
交换排序 |
1.5625 |
118.75 |
1895.3125 |
选择排序 |
1.5625 |
68.75 |
1081.25 |
插入排序 |
1.5625 |
34.375 |
543.75 |
从上面的表格中可以看到,插入排序比其余的几种排序方法快得多。在数据量越大的时候越明显。还有更快的排序方法吗?答案是肯定的。
/******************************************************************************************
*【Author】:flyingbread
*【Date】:2007年1月27日
*【Notice】:
*1、本文为原创技术文章,首发博客园个人站点(
http://flyingbread.cnblogs.com/),转载和引用请注明作者及出处。
*2、本文必须全文转载和引用,任何组织和个人未授权不能修改任何内容,并且未授权不可用于商业。
*3、本声明为文章一部分,转载和引用必须包括在原文中。
******************************************************************************************/
分享到:
相关推荐
冒泡排序算法是一种简单的排序算法,它的工作原理是通过不断地比较相邻元素,并交换它们以达到排序的目的。冒泡排序算法的时间复杂度为O(n^2),因此它适合小规模的数据排序。 2.选择排序算法 选择排序算法也是一种...
1. **冒泡排序**:冒泡排序是一种简单直观的排序算法,通过不断交换相邻的错误顺序元素来逐步完成排序。它重复地走访过要排序的元素,依次比较每一对相邻元素,如果它们的顺序错误就把它们交换过来。走访元素的工作...
冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的...
在本文中,我们将深入探讨基于FPGA的并行快速排序算法,特别关注“位宽可设”的特性。这种算法能够高效地处理大量数据,并且在硬件实现上具有很高的灵活性。我们将从以下几个方面来阐述这个主题: 一、快速排序算法...
【排序算法概述】 排序算法是计算机科学中至关重要的一部分,它涉及到如何有效地重新排列一组数据,使其按照特定标准(如升序或降序)排列。排序算法的效率对程序的性能有着显著影响,尤其是在处理大量数据时。虽然...
**插入排序**是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。这种算法对大数据量的处理效率较低,但对于小规模数据或者部分有序的...
在计算机科学领域,排序算法是数据处理的核心技术之一,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序(如升序或降序)排列。本文将深入探讨标题和描述中提到的一些基本排序算法,包括选择排序、冒泡排序...
详解Java常用排序算法-选择排序 选择排序(Selection Sort)是一种简单的排序算法,它的基本思想是每次从待排序的元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的元素排完。 选择...
冒泡排序是一种基础且经典的排序算法,它的基本思想是通过不断地交换相邻的逆序元素,使得每一轮排序后,最大的元素“浮”到数组的末尾。这个过程就像水底下的气泡逐渐升至水面一样,因此得名“冒泡排序”。 在Java...
在编程领域,排序算法是计算机科学中的基础概念,它用于对一组数据进行排列,以便于检索、分析或处理。在本主题中,我们将探讨如何使用C++类来实现不同的排序算法,并理解类在实现这些算法时的角色。我们将重点关注...
插入排序是一种基础且直观的排序算法,它的工作原理可以类比于整理扑克牌。在实际应用中,插入排序对于小规模数据或者部分有序的数据表现优秀,但对于大规模无序数据,其效率相对较低。以下是关于插入排序的详细知识...
1. **冒泡排序**:冒泡排序是一种简单直观的排序算法,通过重复遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序...
《排序算法-StdDraw动态展示源码》 在计算机科学中,排序算法是处理数据的一种基本技巧,它用于将一组无序的数据按照特定顺序排列。本项目提供的源码旨在通过StdDraw工具动态地展示各种排序算法的过程,帮助学习者...
SelectionSort是一种简单的排序算法,它的基本思想是重复地找到待排序序列中的最小(或最大)元素,然后将其与序列的第一个元素交换。这个过程会持续进行,直到整个序列有序。SelectionSort的主要步骤包括: 1. **...
**选择排序**是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法,因为它可能会...
七大排序算法如下: 交换排序:快速排序quicksort,冒泡排序bubblesort 选择排序:直接选择排序selectionsort,堆排序maxheapsort 插入排序:直接插入排序insertsort,希尔排序shellsort 合并排序:归并排序...
然而,由于其非稳定性和较高的交换次数,HeapSort在实际应用中可能不如其他排序算法如快速排序或归并排序。 在提供的压缩文件中,包含了用C语言实现HeapSort的源代码。通过对这段代码的学习,读者可以深入了解...
在计算机科学中,排序算法是数据处理的重要组成部分,它用于将一组无序的数据按照特定的顺序排列。本项目聚焦于一种基础且经典的排序算法——冒泡排序(Bubble Sort),并以Java编程语言作为实现工具。Java是一种...
冒泡排序是一种基础且经典的计算机科学排序算法,尤其在C++编程中常见。它通过不断地比较相邻元素并根据需要进行交换,逐步将较大的元素“冒泡”到序列的末尾,从而实现升序排列。这一过程可以理解为一个逐层推进的...
在计算机科学中,排序算法是数据结构领域的重要组成部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序(如升序或降序)排列。本项目重点介绍了一种经典的排序算法——冒泡排序(Bubble Sort),并提供...