冒泡排序和选择排序法的图示解析

思路:在进行冒泡法排序(升序)时,需要将数组元素(len)两两比较,如果
前面的元素大于后面的元素,则交换两个数,否则,比较下一个元素和它的下一个元素的大小,依次执行,执行一次循环,可以找到当前数组中最大的一个元素,然后问题规模变小,然后找出len-1个元素里的最大值,使之成为第二大元素,依次执行,需要在外层嵌套一层循环。

优化:考虑如果数组中的数据已经是排好序的,那么就不需要遍历那么多次,定义一个标志位,如果没有执行交换,则说明数组中的元素已经排好序了,这时直接跳出循环。

冒泡排序和选择排序法的图示解析_第1张图片



//用冒泡法排序
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include

void swap(int *x,int *y)
{
    assert(x);
    assert(y);
    *x ^= *y;
    *y ^= *x;
    *x ^= *y;
}

void show(int *arr,int len)
{
    int i = 0;
    assert(arr);
    for (i = 0; i < len; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
}
//bubble sort
void bubble_sort(int *arr,int len)
{
    int j = 0;
    int i = 0;
    int flag = 0;
    assert(arr);
    for (; i < len - 1; i++)
    {
        for (j = 0; j < len - 1 - i; j++)//find max
        {
            if (arr[j] > arr[j+1])
            {
                flag = 1;
                swap(arr+j,arr+j+1);
            }
        }
        if (0 == flag)//如果本来就是排好序的数组,则可以利用标志位来进行优化
        {
            break;
        }
    }
}

int main()
{
    int arr[]= {4300,78,45,3,8,45,798,65};
    show(arr,sizeof(arr)/sizeof(int));
    bubble_sort(arr,sizeof(arr)/sizeof(int));
    show(arr,sizeof(arr)/sizeof(int));
    system("pause");
    return 0;
}

冒泡排序和选择排序法的图示解析_第2张图片

选择法排序图解:

冒泡排序和选择排序法的图示解析_第3张图片

第一种方法:


选择法排序

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include

void show(int arr[],int sz)
{
    int i = 0;
    assert(arr);
    for (i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");

}

void selectsort(int *arr,int sz)
{
    int i = 0;
    int min = 0;
    assert(arr);
    assert(sz > 0); 
    for (i = 0; i < sz; i++)
    {
        int j = 0;
        int k = 0;
        min = arr[i];
        for (j = i + 1;j < sz; j++)
        {
            if (min > arr[j])
            {
                min = arr[j];//遍历一次数组找到最小值,将最小值赋给min,
                            //并记下此时的最小值的下标
                k = j;
            }
        }
        if (min != arr[i])//如果(arr[0])不是最小值,则将arr[0]与此时找到的最小值交换
        {
            arr[k] = arr[i];
            arr[i] = min;   
        }
    }
}



int main()
{
    int arr[] = {9,4,5,6,2,10,6};
    int len = sizeof(arr)/sizeof(arr[0]);
    show(arr,len);
    selectsort(arr,len);
    show(arr,len);
    system("pause");
    return 0;
}

冒泡排序和选择排序法的图示解析_第4张图片

第二种方法:

#pragma warning(disable : 4996)
#include
#include
#include

void swap(int *x,int *y)
{
    assert(x);
    assert(y);
    *x ^= *y;
    *y ^= *x;
    *x ^= *y;
}

void selectsort(int arr[],int len)
{
    assert(arr);
    int i = 0;
    for (i = 0; i < len; i++)
    {
        int minpos = i;
        int j = 0;
        for (j = i; j < len; j++)
        {
            if (arr[j] < arr[minpos])
            {
                minpos = j;
            }
        }
        if (minpos != i)//如果相等,相当于用一个地址处的内容交换,一次异或之后,结果都会成为0,所以要排除掉这种情况
        {
            swap(&arr[i],&arr[minpos]);
        }
    }
}

void show(int arr[],int sz)
{
    int i = 0;
    assert(arr);
    for (i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");

}

int main()
{
    int arr[] = {36,8,6,4,3,23,5,7,34,};
    int len = sizeof(arr)/sizeof(arr[0]);
    show(arr,len);
    selectsort(arr,len);
    show(arr,len);
    system("pause");
    return 0;
}

你可能感兴趣的:(c语言练习题)