turing_class_讲义

3次课
排序

/*几个排序
 问题:比如一个数组有七个数,size还有len是为7,但数组是0-6,所以a[0]-a[6],a[0]-a[7]就很乱,还有递归搜索和二分搜索也是,还有冒泡排序和选择排序是上面为a[0]还是下面为a[0],写成竖的时;
 
 另外:这种问题不用逐个列举,只需将for中i j列出,其他if 的举个例子*/

#include<stdio.h>

void BubbleSort(int a[], int len);
void InsertionSort(int a[], int len);
void SelectionSort(int a[], int len);


int main(void){
    int a[16] = {123,1221,12546,7658,47589,3457435,4578565,57575,3534,634,7547432,235,67576,22,347645,131};
    int b[16] = {123,1221,12546,7658,47589,3457435,4578565,57575,3534,634,7547432,235,67576,22,347645,131};
    int c[16] = {123,1221,12546,7658,47589,3457435,4578565,57575,3534,634,7547432,235,67576,22,347645,131};

    BubbleSort(a, 16);
    InsertionSort(b, 16);
    SelectionSort(c, 16);

    for(int i = 0; i < 16; i++){    
        printf("%d  ", a[i]);
    }
    printf("\n");


    for(int i = 0; i < 16; i++){
        printf("%d  ", b[i]);
    }
    printf("\n");


    for(int i = 0; i < 16; i++){
        printf("%d  ", c[i]);
    }    

    return 0;
}
/*结合csdn还有自己图片理解*/

void BubbleSort(int a[], int len){ 
    int i,j;
    for(i = 0 ; i < len - 1 ; i++){          
        for(j = 0 ; j </*没有等于 故是len-2*/ len - i - 1 ; j++)       
            if(a[j] > a[j+1]){//a[j+1]与a[j]交换
                int t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
    }
    return;
}

void SelectionSort(int a[],int len){
    int i,j;  
    for(i = 0 ; i < len-1 ; i++){//i=1
        int min_index = i;      //min_index=1,下面全是for循环的,至函数结束?若想等则不用变化,有没有结果不变,而且由题意下面全是for的
        for(j = i + 1 ; j < len; j++) //for(j=2;2<8;2++)           
            if(a[ min_index ] > a[j])//if a[1]>a[2]
                min_index = j;  //min_index=2;接着j=3,for循环
            
        if(min_index != i){ //if(min_index!=1) 交换a[i]与a[min_index];
            int temp = a[i];  //int temp=a[1]
            a[i] = a[min_index];  //a[1]=a[2]
            a[min_index] = temp;  
        }  
    }  
}
/*上面选择排序思路:
结合csdn图片
从圈2到圈3的过程
先将最小值赋给第二个数3,再将3 4 2 9 5无序的遍历一遍,找到2<3再将最小值赋给3,由于min_index!=2了,所以要交换,
将数字2与3交换,也就是最小值2排到前面,其他3 4 9 5不变,若min_index=2了,则不要交换,
*/


void InsertionSort(int a[], int len){
    int i, j, key;
    for(i = 1; i < len; i++){
        key = a[i];
        for(j = i - 1; j >= 0; j--){
            if(a[j] > key){
                a[j + 1] = a[j];    
            }
            else{
                break;
            }
        }
        a[j + 1] = key;
    }
}
/* 举个例子
  key 关键比较字
i=8,i=7,把a[8]与a[0]至a[7]比较,其中a[0]至a[7]已拍好,
a[j+1]=a[j],,
将要拍的a[8]放到key里整个for(j=i-1;j>=0;j--)都不变,后若a[7]>a[8],后若a[7]>a[8]则将a[7]的值放到a[8]的位置,最后key的
赋值到a[7]的位置后下一轮,a[9]开始与a[1]~a[8],已排序的与未拍序的在同一个数组。*/

/*输出
22  123  131  235  634  1221  3534  7658  12546  47589  57575  67576  347645  3457435  4578565  7547432  
22  123  131  235  634  1221  3534  7658  12546  47589  57575  67576  347645  3457435  4578565  7547432  
22  123  131  235  634  1221  3534  7658  12546  47589  57575  67576  347645  3457435  4578565  7547432*/



猜你喜欢

转载自www.cnblogs.com/luojialing/p/9963951.html