冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i, j的值依次为1,2,...10-i。
-(NSMutableArray*)array_sort:(NSArray*)numarr
{
NSUInteger count=numarr.count;
int a[count];
//把数组里的元素一一取出转化为整型:
for (int i =0; i <count; i ++)
{
a[i]=[[numarr objectAtIndex:i] intValue];
}
//接收数据的数组:
NSMutableArray*newarray=[[NSMutableArray alloc]initWithCapacity:0];
for (int j=0; j<count-1; j++)
{
//内层for循环:确保每执行一轮:把前count-1-j个元素中最大的一个放到最后面
for (int i=0; i<count-1-j; i++)
{
if(a[i] > a[i + 1])
{
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
//把排好序的数据重新放回数组里:
for (int c =0; c <count; c ++)
{
NSString*numstr=[NSString stringWithFormat:@"%d",a[c]];
[newarray addObject:numstr];
}
return newarray;
}
快速排序:每次选一个基准数,比基准数小的放左边,比基准数大的放右边。
NSMutableArray *QuickSortArr = [[NSMutableArray alloc] initWithObjects:@"2",@"3",@"6",@"9",@"1",@"4",nil];
[self quickSort:QuickSortArr LowQ:0 HightQ:5];
//快速排序
-(NSMutableArray *)quickSort:(NSMutableArray *)dataArr LowQ:(int)low HightQ:(int)hight
{
//1.首次调用传入要排序的数组,传入起始索引和最高索引,对齐比较。
if(low<hight)
{
//如果起始索引小于最高索引,将 I = 起始索引 。 J = 最高索引。
int i = low,j = hight;
//创建一个(要比较内容的类型)的对象,将数组中的起始索引为要取出的对象。
int vot = [[dataArr objectAtIndex:i] intValue];
//while循环判断 起始索引 于 最高索引是否相等
while (i!=j) {
//如果 I(首次是起始索引) 不等于 J(首次是最高索引) 则 WHILE循环 判断I是否小于J于 将数组中取出的对象是否小于或等于从最高索引取出的对象,如果俩条件都满足则: J--;
while (i<j && vot<= [[dataArr objectAtIndex:j]intValue]) j--;
//打印 J 的值
NSLog(@"j==================%d",j);
//首次比较是 起始索引如果小于最高索引
if(i<j)
{
//讲数组里的 起始索引所在的对象 替换成 最高索引的对象
[dataArr replaceObjectAtIndex:i withObject:[dataArr objectAtIndex:j]];
//打印出替换后的起始索引对象
NSLog(@"i=======[dataArray objectAtIndex:%d]=====%@",i,[dataArr objectAtIndex:i]);
//并且起始索引下标I++
i++;
}
//首次比较起始索引是否小于最高索引 并且 数组里取出的起始下标的元素是否小于 起始下标的元素
while
(i<j && [[dataArr objectAtIndex:i]intValue]<vot) {
//若小于则I++
i++;
}
//如果起始索引I 小于最高索引J
if(i<j)
{
// 数组将 最高索引取出的对象替换成 起始索引的对象
[dataArr replaceObjectAtIndex:j withObject:[dataArr objectAtIndex:i]];
//打印出 交换后的对象值
NSLog(@"j======[dataArray objectAtIndex:%d]=====%@",j,[dataArr objectAtIndex:j]);
j--;
}
}
//将数组起始索引位置对象换成 I(起始索引) 赋值后的对象
[dataArr replaceObjectAtIndex:i withObject:[NSString stringWithFormat:@"%d",vot]];
NSLog(@"low:(%d)....high:(%d)....vot:(%d)...%@",low,hight,vot,dataArr);
//递归调用 将换完的数组 和 (最低索引)为 最初的索引 还有 (最高索引)改变后的最高索引J-1.
//两组比较 第一组: 最低索引依旧,最高索引 减一 。第二组: 最低索引为 最低索引+1 最高索引为 最高索引
[self quickSort:dataArr LowQ:low HightQ:j-1];
//递归调用,将换完的数组 和(最低索引) 变换后的I+1 还有(最高索引) 为原来刚进此方法的最高索引 。
[self quickSort:dataArr LowQ:i+1 HightQ:hight];
}
NSLog(@"排序结果:%@",dataArr);
return dataArr;
}
直接插入排序:插前面,依次根后面的数比较
+ (NSMutableArray *)directSortWithString:(NSString *)str {
NSLog(@"正在进行直接插入排序,请稍等...");
NSMutableArray *sortedArr = [[NSMutableArray alloc]init];
NSArray *tempArr = [str componentsSeparatedByCharactersInSet:
[NSCharacterSet whitespaceCharacterSet]];
for(NSString *word in tempArr)
{
if (![word isEqualToString:@""]) {
int selectIndex = [self directSortSelectIndexWithSortedArr:sortedArr WithString:word];
[sortedArr insertObject:word atIndex:selectIndex];
}
}
return sortedArr;
}
#pragma mark 快速插入排序
+(int)directSortSelectIndexWithSortedArr:(NSMutableArray *)arr WithString:(NSString *)str{
float willSortNumber = [str floatValue];
for (int i = 0; i < arr.count; i++) {
if (willSortNumber < [arr[i] floatValue]) {
return i;
}
}
return arr.count;
}
二分插入排序:每次插中间。
+ (NSMutableArray *)dichotomySortWithString:(NSString *)str{
NSMutableArray *sortedArr = [[NSMutableArray alloc]init];
NSLog(@"正在进行二分法插入排序,请稍等...");
NSArray *tempArr = [str componentsSeparatedByCharactersInSet:
[NSCharacterSet whitespaceCharacterSet]];
for(NSString *word in tempArr)
{
if (![word isEqualToString:@""]) {
int selectIndex = [self dichotomySelectIndexWithSortedArr:sortedArr WithString:word];
[sortedArr insertObject:word atIndex:selectIndex];
}
}
return sortedArr;
}
#pragma mark 二分法插入排序
+(int)dichotomySelectIndexWithSortedArr:(NSMutableArray *)arr WithString:(NSString *)str{
float willSortNumber = [str floatValue];
int left = 0;
int i = 0;
int righr = arr.count;
int middle = (righr + left) / 2;
// int middle2 = (righr -left)/2 +left
while (righr > left)
{ i ++;
middle = (left + righr) / 2;
(willSortNumber < [arr[middle] floatValue]) ? righr = middle : (left = middle + 1);
}
return left;
}
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
/*
21,4,25,8
1---4,21,25,8
2---4,8,25,21
3---4,8,21,25
*/
NSMutableArray * dataArray = [[NSMutableArray alloc]initWithObjects:@"15",@"8", @"9", @"87", @"22",@"1",@"29",@"11", nil];
for (int i = 0; i < dataArray.count - 1; i ++)
{
// 声明一个min 假设是最小值的那个索引
int min = i;
// 将第min个值与其他值进行对比
for (int j = i + 1; j < dataArray.count; j++)
{
// 如果min对应的值大于后面的 说明j索引对应的值较小 就把 j赋给min
if ([[dataArray objectAtIndex:min] intValue] > [[dataArray objectAtIndex:j] intValue] )
{
min = j;
}
}
// 如果 m与i相同 就不用进行交换 不同的话就进行交换
if (min != i)
{
[dataArray exchangeObjectAtIndex:min withObjectAtIndex:i];
}
}
NSLog(@"==----%@",dataArray );
网友评论