1、快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
-(void) sortQuick:(NSMutableArray *)arrary low:(NSUInteger)low high:(NSUInteger)high
{
if(low>=high)
return;
NSUInteger index=[self sortUnit:arrary low:low hight:high];
NSLog(@"index=%lu",index);
if(index>1)
{
[self sortQuick:arrary low:low high:index-1];
}
if(index+1<high)
{
[self sortQuick:arrary low:index+1 high:high];
}
}
-(NSUInteger)sortUnit:(NSMutableArray *)arrary low:(NSUInteger)low hight:(NSUInteger)high
{
NSInteger k=[arrary[low] integerValue];
while (low<high) {
while ([arrary[high] integerValue]>=k&&high>low) {
--high;
}
if(high!=low)
{
[arrary exchangeObjectAtIndex:low withObjectAtIndex:high];
}
NSLog(@"%@",arrary);
while ([arrary[low] integerValue]<=k && high>low) {
++low;
}
if(high!=low)
{
[arrary exchangeObjectAtIndex:low withObjectAtIndex:high];
}
NSLog(@"%@",arrary);
}
return high;
}
//
NSMutableArray *source=[NSMutableArray array];
for(int i=0;i<10;i++)
{
NSNumber *num = [NSNumber numberWithInt: arc4random()%100];
[source addObject:num];
}
NSUInteger c = source.count;
[self sortQuick:source low:0 high:c-1];
2、冒泡排序
依次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。
稳定排序、O(n^2)
//冒泡排序:
NSArray *_source=@[@8,@3,@11,@9,@5,@7,@6];
NSMutableArray *source=[NSMutableArray arrayWithArray:_source];
NSUInteger c = source.count;
for(int j=0;j<c;j++)
{
for(int i=0;i<(c-1-j);i++)//最大值在尾部,所以每一遍可以比上一次少比较一位
{
NSInteger m=[source[i] integerValue];
NSInteger n=[source[i+1] integerValue];
if(m>n)
{
[source exchangeObjectAtIndex:i withObjectAtIndex:i+1];
}
}
}
3、选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
demo:
选择最小值放到前边,【有序+无序】;每一遍有序加一、无序减一。
-(void)selectionSort:(NSMutableArray *) ar
{
for(int i=0;i<ar.count-1;i++)
{
int position=i;
for(int j=i+1;j<ar.count;j++)
{
if([ar[j] integerValue]<[ar[position] integerValue])
{
position=j;//position指向最小的
}
}
[ar exchangeObjectAtIndex:i withObjectAtIndex:position];
}
}