【冒泡排序、选择排序、插入排序总结】
一、 算法设计:
1、 冒泡排序(Bubble Sort)
冒泡排序的核心思想是将一个序列的数中依次将最大的数放到最后,再将第二大的数放在倒数第二个位置,再将第三大的数放在倒数第三个位置,依次类推,最后将最小的一个数放在第一个位置(从小到大排列)。如果从大到小就依次将最小的数放在最后的位置,将第二小的数放在倒数第二个位置,然后以此类推将最大的数放在第一个位置。
根据上面这段话就可以来设计冒泡排序的算法:
(假设输入一个包含n个数的序列)
Input array[n]
Fori = 0 to n do
Begin
For j = 0 to n-I do
If array[j] > array[j+1]then
Temp = array[j]
Array[j] = array[j+1]
Array[j+1]=temp
End
Output array[n]
2、 选择排序(Selection Sort)
选择排序的核心思想是依次寻找一个序列的数中最大的一个数,并将其放在最后,再寻找这组序列中第二大的数,并将其放在倒数第二个位置,以此类推,最后将最小的数放在第一个位置(从小到大排列)。如果从大到小排列就一次找到最小的数将它放在最后的位置,再找到倒数第二小的数并将其放在倒数第二个位置,以此类推,最后将最大的数放在第一个位置。
根据上面这段话就可以来设计选择排序的算法了:
(假设输入一个包含n个数的序列)
Inut array[n]
For I =0 to n do
Min= i
Begin
For j = i+1 to n do
If array[j] < array[min]then
Min= j
temp=array[i]
Array[i]=array[min]
Array[min]=temp
End
Output array[n]
3、 插入排序(Insertion Sort)
插入排序有点像在打扑克时,整理扑克牌,就是找到一个关键牌,将它放到排列顺序(可以是从大到小排列,也可以是从小到大排列)它应该在的地方。在设计它的算法时,我们通常从一组序列的数的第二个数(这个数就是关键牌key)开始,依次跟它前面的所有数作比较,如果该数小于它前面的数,就将它前面数的所在位置向后移动一位,如果该数大于或等于它前面的数那么就将该数放在它前面这个数所在的位置(从小到大排列)。从大到小以此类推。
根据上面一段话我们可以设计插入排序的算法:
(假设输入一个包含n个数的序列)
Input array[n]
For I = 1 to n do
Begin
Key= array[i]
J= i
Whilej>0 && key < array[j-1] do
Ifkey < array[j-1] then
Array[j]= array[j-1]
J= j – 1
Array[j]= key
End
Output array[n]
二、 时间复杂度分析:
1、 冒泡排序:
因为冒泡排序中第一个for循环要循环n次,第二个for循环要循环接近n次,每次循环所要执行算法次数为4次,所以f(n) = n * n* 4 = 4*n^2。 在计算时间复杂度时可以忽略常数,所以冒泡排序的时间复杂度为O(n^2)
2、 选择排序:
因为选择排序中第一个for循环要执行n次且第一个for循环每次循环要执行4个算法,第二个for循环要循环接近n次, 且要执行3个算法,即f(n)=4n+n*3n=3n+3n^2, 又因为4n+3n^2<=4n^2+3n^2 推得 f(n)<=7n^2。 在计算时间复杂度时可以忽略常数,所以选择排序的时间复杂度为O(n^2)
3、 插入排序:
因为插入排序的第一个for循环要执行n次,且第一个for循环要执行3个算法,while循环接近 n 次, 且执行3个算法,所以f(n) = 3n + n*3n=3n^2+3n, 又因为3n^2+3n< = 3n^2+3n^2,推得 f(n)<=6n^2 ,在计算时间复杂度时可以忽略常数,所以插入排序的时间复杂度为O(n^2)