# 排序算法

1、冒泡排序

``````//两两比较相邻的关键字，如果反序则交换，直到没有反序的记录为止
- (void)bubbleSort:(NSMutableArray *)array {
for (int i = 0; i < array.count; i++) {
for (int j = 0; j < array.count - i - 1; j++) {
if ([array[j] intValue] > [array[j+1] intValue]) {
int tmp = [array[j] intValue];
array[j] = array[j+1];
array[j+1] = [NSString stringWithFormat:@"%d", tmp];
}
}
}
}
``````

2、选择排序

``````//通过n-i次关键字间的比较，从n-i+1个记录中选出关键字最小的记录，并和第i(1≤i≤n)个记录交换之
- (void)simpleSelectionSortSort:(NSMutableArray *)array {
for (int i = 0; i < array.count; i++) {
for (int j = i+1; j < array.count; j++) {
if ([array[i] intValue] > [array[j] intValue]) {
int tmp = [array[i] intValue];
array[i] = array[j];
array[j] = [NSString stringWithFormat:@"%d", tmp];
}
}
}
}
``````

3、插入排序

``````//从第二个开始，取出该位置的值为临时值temp，位置为j，此时j的位置为空，叫做坑，然后temp依次往前比较，直到找到比temp小，把temp插入该的位置，完成一次循环
- (void)straightInsertionSort:(NSMutableArray *)array{
for (int i = 1; i < array.count; i++) {
int tmp = [array[i] intValue];
int j = i;
while (j > 0 && tmp < [array[j -1] intValue]) {
array[j] = array[j -1];
j--;
}
array[j] = [NSString stringWithFormat:@"%d", tmp];
}
}
``````

4、希尔排序

``````//希尔排序
- (void)shellSort:(NSMutableArray *)array {
int gap = (int)array.count / 2;
while (gap >= 1) {
for (int i = gap; i < array.count; i++) {
int tmp = [array[i] intValue];
int j = i;
while (j >= gap && tmp < [array[j-gap] intValue]) {
array[j] = array[j-gap];
j -= gap;
}
array[j] = [NSString stringWithFormat:@"%d", tmp];
}
gap = gap/2;
}
}
``````

5、堆排序

``````//堆排序
- (void)heapSort:(NSMutableArray *)array {
NSInteger size = array.count;
//将现在的待排序序列构建成一个大顶堆
for (NSInteger i = size/2; i >= 0; i--) {
[self createBiggerHeap:array withSize:size beIndex:i];
}
//逐步将每个最大值的根节点与末尾元素交换，并再调整其成为一个大顶堆
while (size > 0) {
[array exchangeObjectAtIndex:size - 1 withObjectAtIndex:0];
size--;
[self createBiggerHeap:array withSize:size beIndex:0];
}
}
- (void)createBiggerHeap:(NSMutableArray *)array withSize:(NSInteger)size beIndex:(NSInteger)index {
NSInteger leftChild = index*2 + 1;
NSInteger rightChild = leftChild + 1;
while (rightChild < size) {
if ([array[index] intValue] >= [array[leftChild] intValue] && [array[index] intValue] >= [array[rightChild] intValue]) {
return;
}
if ([array[leftChild] intValue] > [array[rightChild] intValue]) {
[array exchangeObjectAtIndex:index withObjectAtIndex:leftChild];
index = leftChild;
} else {
[array exchangeObjectAtIndex:index withObjectAtIndex:rightChild];
index = rightChild;
}
leftChild = index*2 + 1;
rightChild = leftChild + 1;
}

//只有左子树且左子树大于自己
if (leftChild < size && [array[leftChild] intValue] > [array[index] intValue]) {
[array exchangeObjectAtIndex:leftChild withObjectAtIndex:index];
}
}
``````

6、归并排序

``````- (NSArray *)mergeSort:(NSArray *)array {
NSMutableArray *resultArr = [NSMutableArray array];
for (NSNumber *num in array) {
NSMutableArray *subArr = [NSMutableArray array];
}
while (resultArr.count > 1) {
NSInteger i = 0;
while (i < resultArr.count -1) {
resultArr[i] = [self mergeFirstArr:resultArr[i] withSecondArr:resultArr[i+1]];
[resultArr removeObjectAtIndex:i+1];
i++;
}
}
return resultArr;
}

- (NSArray *)mergeFirstArr:(NSArray *)firstArr withSecondArr:(NSArray *)secondArr {
NSMutableArray *resultArr = [NSMutableArray array];
NSInteger firstIndex = 0;
NSInteger secondIndex = 0;
while (firstIndex < firstArr.count && secondIndex < secondArr.count) {
if ([firstArr[firstIndex] integerValue] < [secondArr[secondIndex] integerValue]) {
firstIndex++;
} else {
secondIndex++;
}
}
while (firstIndex < firstArr.count) {
firstIndex++;
}
while (secondIndex < secondArr.count) {
secondIndex++;
}
return resultArr;
}
``````

7、快速排序

``````//数组选第一个数，把比数小的放到数的左边，比数大的放到右边，重复操作
- (void)quickSortArray:(NSMutableArray *)array withLeftIndex:(NSInteger)leftIndex andRightIndex:(NSInteger)rightIndex {
if (leftIndex >= rightIndex) {
return;
}
NSInteger i = leftIndex;
NSInteger j = rightIndex;
NSInteger key = [array[i] integerValue];
while (i < j) {
while (i < j && [array[j] integerValue] >= key) {
j--;
}
array[i] = array[j];
while (i < j && [array[i] integerValue] <= key) {
i++;
}
array[j] = array[i];
}
array[i] = [NSString stringWithFormat:@"%ld", (long)key];
[self quickSortArray:array withLeftIndex:leftIndex andRightIndex:i-1];
[self quickSortArray:array withLeftIndex:i+1 andRightIndex:rightIndex];
}

``````

• 序言：七十年代末，一起剥皮案震惊了整个滨河市，随后出现的几起案子，更是在滨河造成了极大的恐慌，老刑警刘岩，带你破解...
沈念sama阅读 78,735评论 1 172
• 序言：滨河连续发生了三起死亡事件，死亡现场离奇诡异，居然都是意外死亡，警方通过查阅死者的电脑和手机，发现死者居然都...
沈念sama阅读 26,790评论 1 143
• 文/潘晓璐 我一进店门，熙熙楼的掌柜王于贵愁眉苦脸地迎上来，“玉大人，你说我怎么就摊上这事。” “怎么了？”我有些...
开封第一讲书人阅读 30,317评论 0 102
• 文/不坏的土叔 我叫张陵，是天一观的道长。 经常有香客问我，道长，这世上最难降的妖魔是什么？ 我笑而不...
开封第一讲书人阅读 16,691评论 0 87
• 正文 为了忘掉前任，我火速办了婚礼，结果婚礼上，老公的妹妹穿的比我还像新娘。我一直安慰自己，他们只是感情好，可当我...
茶点故事阅读 21,947评论 0 144
• 文/花漫 我一把揭开白布。 她就那样静静地躺着，像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上，一...
开封第一讲书人阅读 18,037评论 0 87
• 那天，我揣着相机与录音，去河边找鬼。 笑死，一个胖子当着我的面吹牛，可吹牛的内容都是我干的。 我是一名探鬼主播，决...
沈念sama阅读 10,808评论 2 161
• 文/苍兰香墨 我猛地睁开眼，长吁一口气：“原来是场噩梦啊……” “哼！你这毒妇竟也来了？” 一声冷哼从身侧响起，我...
开封第一讲书人阅读 10,247评论 0 78
• 想象着我的养父在大火中拼命挣扎，窒息，最后皮肤化为焦炭。我心中就已经是抑制不住地欢快，这就叫做以其人之道，还治其人...
爱写小说的胖达阅读 8,767评论 5 112
• 序言：老挝万荣一对情侣失踪，失踪者是张志新（化名）和其女友刘颖，没想到半个月后，有当地人在树林里发现了一具尸体，经...
沈念sama阅读 12,041评论 0 130
• 正文 独居荒郊野岭守林人离奇死亡，尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
茶点故事阅读 10,790评论 1 126
• 正文 我和宋清朗相恋三年，在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
茶点故事阅读 11,579评论 0 128
• 白月光回国，霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前， 不然我有一百种方法让你生不如死。]我...
爱写小说的胖达阅读 6,418评论 0 17
• 序言：一个原本活蹦乱跳的男人离奇死亡，死状恐怖，灵堂内的尸体忽然破棺而出，到底是诈尸还是另有隐情，我是刑警宁泽，带...
沈念sama阅读 9,223评论 2 116
• 正文 年R本政府宣布，位于F岛的核电站，受9级特大地震影响，放射性物质发生泄漏。R本人自食恶果不足惜，却给世界环境...
茶点故事阅读 12,344评论 3 124
• 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹，春花似锦、人声如沸。这庄子的主人今日做“春日...
开封第一讲书人阅读 8,062评论 0 3
• 文/苍兰香墨 我抬头看了看天上的太阳。三九已至，却和暖如春，着一层夹袄步出监牢的瞬间，已是汗流浃背。 一阵脚步声响...
开封第一讲书人阅读 8,277评论 0 77
• 我被黑心中介骗来泰国打工， 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留，地道东北人。 一个月前我还...
沈念sama阅读 12,819评论 2 133
• 正文 我出身青楼，却偏偏与公主长得像，于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子，可洞房花烛夜当晚...
茶点故事阅读 13,458评论 2 130