冒泡排序&鸡尾酒排序 - OC
一、冒泡排序
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
步骤拆分:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
算法复杂度
最好最坏都是:O(n^2)
所以冒泡在数据量大的时候是不推荐的,效率低下
二、鸡尾酒排序
鸡尾酒排序(定向冒泡排序),可以说鸡尾酒排序是冒牌排序的改良,不同于冒泡的从左到右比较,鸡尾酒排序是第一趟左向右排序,第二趟 右向左排序,往返,直至左右相遇
算法复杂度
最坏:O(n^2)
最好:O(n)
所以在部分排序好的情况下 花费接近 O(n)
#pragma mark 冒泡排序 OC
+ (void)bubble_sort:(NSMutableArray *)list{//接收一个可变数据list
//循环数组大小的次数 因为要走访要排序的数列
for (int i = 0; i < list.count; i++) {
//相应i下标位置开始位置需要对比的次数
for (int j = 0; j < list.count - i - 1; j++) {
//如果j下标位置 小于 j+1位置的
if (list[j] < list[j+1]) {
//循环主体,使用temp临时存放 j 小标的数
int temp = [list[j] intValue];
//将 j+1 下标的数放入 j 下标的数
list[j] = list[j + 1];
//再将temp 放入 j+1 位置
list[j + 1] = [NSNumber numberWithInt:temp];
}
}
}
#pragma mark 冒泡排序 C
void bubble_sort(int a[], int n)
{
int i, j, temp;
for (j = 0; j < n - 1; j++)
for (i = 0; i < n - 1 - j; i++)
{
if(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
#pragma mark 鸡尾酒排序
+ (void)cocktail_sort:(NSMutableArray *)list{
int i;
int left = 0;
int right = (int)list.count - 1;
int temp;
while (left < right) {
// 假设是第一次循环
//i 从 0 开始往右循环一遍,类似于冒泡,把最大的放到最后
for (i = left; i < right; i++){
//判断条件和冒泡一致
if (list[i] > list[i + 1]) {
//temp 临时存放
temp = [list[i] intValue];
//将 i+1 下标的数放入 i 下标的数
list[i] = list[i + 1];
//再将temp 放入 i+1 位置
list[i + 1] = [NSNumber numberWithInt:temp];
}
}
//右边减减 是因为最大的已经被放到最后了,所以右边不需要从最后一位开始
right--;
//同时开始从右到左排序,把最小的放到最前
for (i = right; i > left; i--){
if (list[i - 1] > list[i]) {
//tmp 临时存放
temp = [list[i] intValue];
//将 i-1 下标的数放入 i 下标的数
list[i] = list[i - 1];
//再将temp 放入 j-1 位置
list[i - 1] = [NSNumber numberWithInt:temp];
}
}
//待到最小的放到了最前,这个left就可以从第二位开始循环了
left++;
}
}