上篇文章说到了冒泡排序,这篇文章讲解一下选择排序算法。具体内容还是从算法实现思想、时间复杂度、算法稳定性以及算法实现四个方面介绍。
1
算法实现思想
1、n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果;
2、初始状态:无序区为R[1..n],有序区为空;
3、第1趟排序: 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
4、第i趟排序:第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
2
时间复杂度:min = O(n),max = O(n^2)
3
算法稳定性:不稳定
不稳定的原因举例:5 5 3 变为 3 5 5,第一趟排序,第一个5会和3的位置互换,从而破坏该算法的稳定性。
4
算法实现 (升序)
C语言实现:
void selectAlgorithm(
int array[]){
int count = sizeof(array)/sizeof(int);
int index;
for (int i = 0; i < count - 1; i ++) {
index = i;
for (int j = i + 1; j < count; j ++) {
if (array[index] > array[j]) {
index = j;
}
}
if (index != i) {
int temp = array[i];
array[i] = array[index];
array[index] = temp;
}
}
}
Swift语言实现:
func selectorMethods(array: [Int]) -> [Int] {
var dataArray = array
let count = dataArray.count
var index: Int
for i in 0..<count-1 {
index = i
for j in i+1..<count {
if dataArray[index] > dataArray[j] {
index = j
}
}
if index != i {
let temp = dataArray[i]
dataArray[i] = dataArray[index]
dataArray[index] = temp
}
}
return dataArray
}
Objective-C语言实现:
- (NSArray *)selectAlgorithm:(NSArray *)array{
NSMutableArray *tempArray = [NSMutableArray arrayWithArray:array];
NSInteger count = tempArray.count;
int index;
for (int i = 0; i < count - 1; i ++) {
index = i;
for (int j = i + 1; j < count; j ++) {
if (tempArray[index] > tempArray[j]) {
index = j;
}
}
if (index != i) {
id temp = tempArray[i];
[tempArray replaceObjectAtIndex:i withObject:tempArray[index]];
[tempArray replaceObjectAtIndex:index withObject:temp];
}
}
return tempArray;
}
最后,感谢大家阅读,如有问题,欢迎大家留言!!!