1算法(含冒泡排序的优化及打乱顺序)

int main(int argc,const char * argv[]) { 

    int a[] = {10,2, 3,5, 6,4, 7,8, 9,1};

    int count =sizeof(a) / sizeof(a[0]);

冒泡排序优化版 

假设本来的数据本来就是从小到大有序的,则原有算法仍要做count-1趟比较操作,事实上,一趟比较下来,若发现没有进行过交换,若发现没有进行过交换,就已经说明数据全部有序,无须进行其后的比较操作了。经过少于count-1趟比较交换操作后,数据就已经有序的概率却非常高。这时就考虑用标志量来记录每趟交换数据的的情况,如flag=1表示没有进行过交换(有序),一旦有数据进行交换则置flag为0(无序),表示已进行过交换,当一趟比较交换完成后,若flag仍为1时,则无须进行下一趟操作,否则若flag为0时,只能继续进行下一趟操作。


//    int flag = 0;  //0无序  1有序

//    for ( i = 0; i < count - 1 && 0 == flag; i++) {

//        flag = 1;

//        for (int j = 0 ; j < count - 1 - i; j++) {

//            if (a[j] > a[j + 1]) {

//                int t = a[j];

//                a[j] = a[j + 1];

//                a[j + 1] = t;

//                flag = 0; //确定无序

//            }

//        }   

//    }

//    printf("%d\n", i); //进行了多少次冒泡;

//

//    for (int i = 0; i < count; i++) {

//        printf("%d\n", a[i]);

//    }


 //冒泡排序

//    int flag = 0;

//    for (int i = 0; i < count - 1 && 0 == flag; i++) {

//      flag = 1;

//        for (int j = 0; j < count - 1 - i; j++) {

//            if (a[j] > a[j + 1]) {

//                int temp = a[j];

//                a[j] = a[j + 1];

//                a[j + 1] = temp;

 //               flag = 0;

//            }

//        }    

//    }

//    for (int i = 0; i < count; i++) {

//        printf("%d\n", a[i]);

//    }



//选择排序

//

//    for (int i = 0; i < count - 1; i++) {

//        int minindex = i;

//        for (int j = minindex + 1 ; j < count; j++) {

//            if (a[minindex] > a[j]) {

//                minindex = j;

//            }

//        }

//        if (minindex != i) {    

//            int temp;

//            temp = a[minindex];

//            a[minindex] = a[i];

//            a[i] =temp;

//        }

//    }

//    for (int i =0; i < count; i++) {

//        printf("%d\n", a[i]);

//    }

      

//插入排序


//    for (int i = 1; i < count ; i++) {  

//        int j = i;

//        int temp = a[j];     

//        while (j > 0 && temp < a[j - 1] ) {

//            a[j] = a[j - 1];

//            j--;

//           }

//            a[j] = temp;

//        }

//    for (int i = 0 ; i < count ; i++) {

//        printf("%d\n", a[i]);

//    }

//

快速排序


void quickSort(int array[], int count) {

    int start = 0;

    int end = count - 1;

    int temp = array[start];

    if (count < 2) {

        return;

    }

        while (start < end) {

        

        while (start < end && array[end] > temp) {

            end--;

        }

        if (start < end) {

        array[start] = array[end];

        start++;

        }

        

        while (start < end && array[start] < temp) {

            start++;

        }

        if (start < end) {

        array[end] = array[start];

        end--;

        }

        }

    

        array[start] = temp;

        quickSort(array, start);

        quickSort(array + start + 1, count - start - 1);


}


折半查找


//    int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

//    int count = 10;

//    int tagert = 6;

//    int mid = 0;

//    int i = 0, j = count - 1;

//    

//    while (i <= j) {

//        mid = (i + j) / 2;

//        if (array[mid] > tagert) {

//            j = mid - 1;

//        }

//        else if (array[mid] < tagert) {

//            i = mid + 1;

//        }

//        else {

//            break;

//        }

//    }

  

//    if (i <= j) {

//        printf("%d\n", mid);

//    }

//    else {

//        printf("not found\n");

//    }


//打乱顺序 俗称洗牌。

//    for (int i = count - 1; i > 0; i--) {

//        int rindex = arc4random() % (i + 1);

//        if (rindex != i) {

//            

//        int temp;

//        temp = a[rindex];

//        a[rindex] = a[i];

//        a[i] = temp;

//       }

//    }

//    

//    for (int i = 0; i < count; i++) {

//        printf("[%2d]: %d\n", i, a[i]);

//    }

    

    return0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值