算法练习(一:排序算法)

  这里用c语言介绍比较常用的排序算法:冒泡法,交换法,选择法,插入法和快速排序这五种排序算法,并计算算法的时间复杂度。

  代码如下:

#include <stdio.h>

void printList(int a[]){
    for (int i = 0; i<10; i++) {
        printf(" %d",a[i]);
    }
    printf("\n");
}
void bubbleSort(int a[]){
    for (int i = 0 ; i<10; i++) {
        for (int j = 9; j>i; j--) {
            if (a[j]<a[j-1]) {
                int timp = a[j-1];
                a[j-1] =a[j];
                a[j] = timp;
            }
        }
    }
}
void exchangeSort(int a[]){
    for (int i = 0; i<10; i++) {
        for (int j = 9 ; j>i; j--) {
            if (a[i]>a[j]) {
                int timp = a[i];
                a[i] =a[j];
                a[j] = timp;
            }
        }
    }
}
void selectSort(int a[]){
    for (int i = 0; i<10; i++) {
        int minIndex = i;
        for (int j = 9 ; j>i; j--) {
            if (a[j]<a[minIndex]) {
                minIndex = j;
            }
        }
        int timp = a[minIndex];
        a[minIndex] =a[i];
        a[i] = timp;
    }
}
void insertSort(int a[]){
    for (int i = 1; i<10; i++) {
        if (a[i]<a[i-1]) {
            int j = i;
            int temp = a[i];
            while (a[j-1]>temp&&j>0) {
                a[j] = a[j-1];
                j--;
            }
            a[j] = temp;
        }
    }
}
void quickSort(int a[] , int left ,int right){
    if (left>right) {
        return;
    }
    int i = left;
    int j = right;
    int p = a[i];
    while(i < j)
    {
        while(i< j && p <a[j])
        {
            j --;
        }
        a[i] = a[j];
        while(i < j && p >a[i])
        {
            i ++;
        }
        a[j] = a[i];
    }
    a[i] = p;
    quickSort(a,left,i -1);
    quickSort(a,i +1, right);
}
int main(int argc, const char * argv[]) {
    int a[] = {9,8,7,6,5,4,3,2,1,0};
    printf("初始化数组\n");
    printList(a);
//    bubbleSort(a);
//    exchangeSort(a);
//    selectSort(a);
//    insertSort(a);
    quickSort(a,0,9);
    printf("排序后数组\n");
    printList(a);
    return 0;
}

时间复杂度及方法核心思想

1.冒泡法:通过相邻两个数的两两比较大小。算法的时间复杂度:O(n^2)

2.交换法:从前往后比较,遇到较小的交换。算法的时间复杂度:O(n^2)

3.选择法:选择一个最小(或最大)的进行交换。算法的时间复杂度:O(n^2)

4.插入法:选择一个最小(或最大)的插入到合适的位置。算法的时间复杂度:O(n^2)

5.快速排序法:从中找出一个中间数,比改数大的和小的防止该数的两侧。利用递归一次进行。算法的时间复杂度:O(nlogn)

 

demo下载地址:https://github.com/fushengit/automatic

 

posted @ 2017-03-14 16:48  MakeKeyReuseable  阅读(224)  评论(0编辑  收藏  举报