以下代码带有文字说明,各位可以直接复制使用,进行结果展示,这里推荐一篇图文介绍算法的文章:http://www.jianshu.com/p/70619984fbc6
- (void)viewDidLoad {
[super viewDidLoad];
//NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"20",@"6",@"2",@"8",@"9",@"12",@"2",@"4",@"3",@"4",@"7",@"11", nil];
int array[12] = {20,6,2,8,9,12,2,4,3,4,7,11};
/*
//冒泡排序:相邻两个比较,大的放后面
BOOL exchanged = YES;
for (int i = 0; i < 11 && exchanged; i ++)
{
exchanged = NO;
for (int j = 0; j < 11 - i; j ++)
{
int aj = array[j];
int aj1 = array[j + 1];
if (aj > aj1)
{
exchanged = YES;
array[j + 1] = aj;
array[j] = aj1;
}
}
}
*/
/*
//选择排序:选择每一轮的小的放在前面,排好序的不比较
for (int i = 0; i < 12; i ++)
{
for (int j = i + 1; j < 12; j ++)
{
int ai = array[i];
int aj = array[j];
if (ai > aj)
{
array[i] = aj;
array[j] = ai;
}
}
}
*/
/*
//插入排序:将一个值拿出,空出一个位置,与前面的所有的值比较,比其大的后移一位,直到没有比其小的停止,并把值插入到空位处
for (int i = 1; i < 12; i ++)
{
int ai = array[i],aj;
int j = i;
while (j > 0 && (aj = array[j - 1]) > ai)
{
array[j] = aj;
j --;
}
array[j] = ai;
}
*/
//快速排序:首先任意选取一个数据(通常选数组的第一个数)作为关键数据,然后将所有比他小的数据都放在她得前面,所有比他大的数都放到它的后面,与一个数的比较,有时候会前后两个方向进行,这个过程成为一趟快速排序
//C语言调用方法
quick(array,0,11);
//排序后输出
for (int n = 0; n < 12; n ++)
{
NSLog(@"%d",array[n]);
}
}
void quick(int a[],int left, int right)
{
if (left < right)//如果左边索引小于右边的索引就代表已经整理完成一个组了
{
int key = a[ left ];
int low = left;
int hight = right;
while ( low < hight)//控制在当前组内寻找一遍
{
while( low < hight && a[hight] >= key)//而寻找结束的条件就是:1.找到一个小于或者大于key的数(大于或小于取决于你想升序还是降序)2.没有符合条件 1 的,并且 low 与 hight 的大小没有翻转
{
hight --;//向前寻找
}
a[ low ] = a [ hight ];
//找到一个这样的数后就把它赋给前面的被拿走的low的值(如果第一次循环且key是a[left],那么就是给key)
while( low < hight && a[ low ] <= key)//这是low在当前组内向前寻找,同上,不过注意与key的大小关系停止循环和上面襄樊,因为排序思想是把数往两边放,所以左右两边的数大小与key的关系相反
{
low ++;//向后寻找
}
a[ hight ] = a[ low ];
}
a[ low ] = key;//当在当前组内找完一遍以后就把中间数key回归
quick( a, left ,low - 1);//最后用同样的方式对分出来的左边的小组进行同上的做法
quick( a, low + 1, right);//用同样的方式对分出来的右边的小组进行同上的做法,当然最后可能会出现很多次分左右,直到每一组的low = hight为止
}
}