以下代码带有文字说明,各位可以直接复制使用,进行结果展示,这里推荐图文介绍算法的文章:http://www.jianshu.com/p/70619984fbc6
第二篇(Swift版)http://www.cocoachina.com/ios/20170105/18522.html
- (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};
/*
//冒泡排序:将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。相邻两个比较,大的放后面。时间复杂度,平均情况:O(n^2),最好情况:O(n)
/** * 【冒泡排序】:相邻元素两两比较,比较完一趟,最值出现在末尾 * 第1趟:依次比较相邻的两个数,不断交换(小数放前,大数放后)逐个推进,最值最后出现在第n个元素位置 * 第2趟:依次比较相邻的两个数,不断交换(小数放前,大数放后)逐个推进,最值最后出现在第n-1个元素位置 * …… …… * 第n-1趟:依次比较相邻的两个数,不断交换(小数放前,大数放后)逐个推进,最值最后出现在第2个元素位置 */
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;
}
}
}
*/
/*
//选择排序:将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。选择每一轮的小的放在前面,排好序的不比较。时间复杂度,平均情况:O(n^2),最好情况:O(n^2)。
/** * 【选择排序】:最值出现在起始端 * * 第1趟:在n个数中找到最小(大)数与第一个数交换位置 * 第2趟:在剩下n-1个数中找到最小(大)数与第二个数交换位置 * 重复这样的操作...依次与第三个、第四个...数交换位置 * 第n-1趟,最终可实现数据的升序(降序)排列。 * */
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;
}
}
}
*/
/*
//插入排序:将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。将一个值拿出,空出一个位置,与前面的所有的值比较,比其大的后移一位,直到没有比其小的停止,并把值插入到空位处。时间复杂度,平均情况:O(n^2),最好情况:O(n)。
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为止
}
}
常用排序的时间复杂度: