1.选择排序
基本思想:1)从待排序列中选出最小的,然后将选出元素和序列中的第一个元素互换位置(当前默认为升序排列);2)从待排序列中选出最小的,将选出元素与该子序列第一个元素(即整个序列的第二个元素)互换位置;3)直到待排序列中只剩下一个元素,停止排序过程。最后得到的是一个有序的序列。每一趟可以选出待排序列中的一个最小值。
例:待排序列(5,2,8,4,1,3)
第一趟:选出待排序列中最小的“1”(第5个位置),与第一个元素交换,得到第一趟排好的序列(1,2,8,4,5,3)。
第二趟:选出待排序列(2,8,4,5,3)中最小元素“2”(第一个元素),最小元素已经在第一个位置上,所以不交换,得到第二趟拍好的序列为(1,2,8,4,5,3)。
第三趟:选出待排序列(8,4,5,3)中的最小元素“3”(第4个位置),与第一个元素交换位置,得到第三趟排好序的序列(1,2,3,4,5,8)。
.......
依次排序,最后可以得到一个有序的序列(升序)。
2.冒泡排序
像气泡一样,轻的往上浮,重的往下沉。通过对待排序列每相邻元素比较,每一趟都可以将待排序列中的最大值放到相应的位置上。
例:待排序列a=(5,2,8,4,1,3)
第一趟:第一步得到(2,5,8,4,1,3)
第二步得到(2,5,8,4,1,3)
第三步得到(2,5,4,8,1,3)
第四步得到(2,5,4,1,8,3)
第五步得到(2,5,4,1,3,8)
第二趟:第一步得到(2,5,4,1,3,8)
第二步得到(2,4,5,1,3,8)
第三步得到(2,4,1,5,3,8)
第四步得到(2,4,1,3,5,8)
........
按着此步骤,最后可以得到一个有序的序列(升序)。
//为了便于理解,下面给出了冒泡排序的伪代码。
for i = 1 to len(a)-1:
for j = 1 to len(a)-i:
if a[j] > a[j+1]: //相邻元素判断大小,交换位置
temp = a[j+1]
a[j+1] = a[j]
a[j] = temp
end if
end for
end for
3.插入排序
3.1直接插入排序
将待排序列中的元素一个一个插入到一个已经有序的序列中。1)找到待插入的位置;2)待插入位置后面的元素后移;3)插入元素。
//伪代码实现如下:
for i =1 to len(a):
temp = a[i]
j = i -1
while(j>0 && temp < a[j]): //找到待插入点的位置
{ a[j+1] = a[j]
j--
}
a[j+1] = temp //插入元素
end for
3.2 折半插入
对一个有序的序列,待插入元素与有序序列的中间值进行比较;如果比中间值大,就在后半部分再采用相同方法对比;如果比中间值小,就与前半段元素至比对。
//伪代码实现如下:
for i =1 to len(a):
temp = a[i]
low = 0
high = i-1
while(low <= high){ //折半的方法,找到插入点位置
mid = (low+high)/2
if temp < a[mid]:
high = mid -1
else
low = mid + 1
end if
}
for (j = i-1 ; j >= high+1; j--){ //插入点位置后面元素逐个后移
a[j+1] = a[j]
}
a[high+1] = temp //插入元素
4.希尔排序
例:待排序列a=(5,2,8,4,1,3)
第一趟排序:1)d1=3,进行标记出对比交换的对(用红、绿、蓝三种颜色标记配对),(5,2,8,4,1,3)
2)对同一种颜色标记的元素比较、交换位置,得到(4,1,3,5,2,8)
第二趟排序:1)d2=1,进行标记出对换的对,由于d2=1,所以为相邻位置交换
2)得到(1,3,4,2,5,8)
.......
最后可以得到一个有序序列。其中,d[i+1]=d[i]/2.