冒泡排序详解7-20

//
//  main.m
//  Mypritice1
//
//  Created by laouhn on 15/7/18.
//  Copyright (c) 2015年 池海涛. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
   /*
    int a[5] = {38,24,18,29,10};
    //冒泡排序
    int temp = 0;
    for (int i = 0; i < 5 - 1; i++) {
        for (int j = 0; j < 5 - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                temp = a[j];
                a[j] = a[j+1];
                a[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < 5; i++) {
        printf("%d ",a[i]);
    }
    */
    //冒泡排序详解
    /*
    1.冒泡排序的原理
     //38,24,18,29,10
     //两两比较,大的前移
     第一遍循环比较
     24,38,18,29,10
     24,18,38,29,10
     24,18,29,38,10
     24,18,29,10,38
     第二遍循环比较
     18,24,29,10,38
     18,24,29,10,38
     18,24,10,29,38
     第三遍循环比较
     18,24,10,29,38
     18,10,24,29,38
     第四遍循环比较
     10,18,24,29,38
     每一趟找出最大值
     */
    
    int a[5] = {38,24,18,29,10};
    int temp = 0;
    //第一趟的比较找出最大值,注意i < 5 - 1不能为i < 5 否则越界
    for (int i = 0;  i < 5 - 1; i++ ) {
        if (a[i] > a[i + 1]) {
            temp = a[i];
            a[i] = a[i + 1];
            a[i + 1] = temp;
        }
    }
    //第二趟比较
    for (int i = 0;  i < 5 - 1; i++ ) {
        if (a[i] > a[i + 1]) {
            temp = a[i];
            a[i] = a[i + 1];
            a[i + 1] = temp;
        }
    }
    //第三趟比较
    for (int i = 0;  i < 5 - 1; i++ ) {
        if (a[i] > a[i + 1]) {
            temp = a[i];
            a[i] = a[i + 1];
            a[i + 1] = temp;
        }
    }
    //第四趟比较
    for (int i = 0;  i < 5 - 1; i++ ) {
        if (a[i] > a[i + 1]) {
            temp = a[i];
            a[i] = a[i + 1];
            a[i + 1] = temp;
        }
    }
       //从上面可以看出没一趟的比较代码都是一样的
    //5个数排序,比较4趟,n个数排序比较n - 1趟,    //所以在for循环外加一个for循环,表示循环的趟数
    for (int j = 0; j < 5 -1; j++) {//循环了4趟
        for (int i = 0;  i < 5 - 1; i++ ) {//每趟比较了4次
            if (a[i] > a[i + 1]) {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
    }
    //每一趟比较了4次,照成不必要的比较,第一趟比较4次,第二趟比较3次,第三趟比较2,第四趟比较1次
    //上面的代码照成了无用的循环
    for (int j = 0; j < 5 -1; j++) {//循环了4趟
        for (int i = 0;  i < 5 - 1 - j; i++ ) {//每趟比较了5 -1 -j次
            if (a[i] > a[i + 1]) {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wohaoxue/p/4656293.html