选择排序

选择排序

选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。



代码实现如下:

@interface DMSelectionSort : NSObject

// 选择排序
- (void)selectionSort:(NSMutableArray *)array;

@end

@implementation DMSelectionSort

- (void)selectionSort:(NSMutableArray *)array
{
    NSLog(@"选择排序前数据:%@", array);
    NSInteger count = [array count];
    for (NSInteger i = 0; i < count - 1; i++) {
        NSNumber *tmpValue = [array objectAtIndex:i];
        NSNumber *minValue = tmpValue;
        NSInteger minIndex = i;
        for (NSInteger j = i + 1; j < count; j++) {
            NSNumber *twoValue = [array objectAtIndex:j];
            if ([minValue integerValue] > [twoValue integerValue]) {
                minValue = twoValue;
                minIndex = j;
            }
        }
        
        if (minIndex != i) {
            // 互换
            [array replaceObjectAtIndex:i withObject:minValue];
            [array replaceObjectAtIndex:minIndex withObject:tmpValue];
        }
    }
    NSLog(@"选择排序后数据:%@", array);
}

@end

@interface DMSortDemo : NSObject

@end

@implementation DMSortDemo

- (void)demo 
{   
    // 选择排序
    DMSelectionSort *selectionSort = [[DMSelectionSort alloc] init];
    {
        NSMutableArray *dataArray = [[NSMutableArray alloc] init];
        [dataArray addObject:[NSNumber numberWithInteger:4]];
        [dataArray addObject:[NSNumber numberWithInteger:5]];
        [dataArray addObject:[NSNumber numberWithInteger:6]];
        [dataArray addObject:[NSNumber numberWithInteger:1]];
        [dataArray addObject:[NSNumber numberWithInteger:3]];
        [dataArray addObject:[NSNumber numberWithInteger:2]];
        [selectionSort selectionSort:dataArray];
    }
    {
        NSMutableArray *dataArray = [[NSMutableArray alloc] init];
        [dataArray addObject:[NSNumber numberWithInteger:3]];
        [dataArray addObject:[NSNumber numberWithInteger:5]];
        [dataArray addObject:[NSNumber numberWithInteger:4]];
        [dataArray addObject:[NSNumber numberWithInteger:1]];
        [dataArray addObject:[NSNumber numberWithInteger:2]];
        [dataArray addObject:[NSNumber numberWithInteger:6]];
        [selectionSort selectionSort:dataArray];
    }
}

@end


首先,选择排序空间复杂度为O(1),是一种原地排序算法。选择排序的最好情况时间复杂度、最坏情况和平均情况时间复杂度都为O(n * n)。
选择排序是一种不稳定的排序算法。从第一张图可以看出来,选择排序每次都要找剩余未排序元素中的最小值,并和前面的元素交换位置,这样破坏了稳定性。比如5,8,5,2,9这样一组数据,使用选择排序算法来排序的话,第一次找到最小元素2,与第一个5交换位置,那第一个5和中间的5顺序就变了,所以就不稳定了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容