选择排序跟冒泡排序的比较

/*时间复杂度
选择排序:比较次数O(n^2)总的比较次数N=(n-1)+(n-2)+…+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。

冒泡排序:若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数为n-1,交换次数为0,所以,冒泡排序最好的时间复杂度为O(n); 若初始文件是反序的,需要进行趟排序。每趟排序要进行次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:C = n*(n-1)/2 M = 3n*(n-1)/2。
*/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>

//选择排序,找出每一轮最小元素放在本轮开头位置 
void SelectSort(int arr[], int length)
{
    int tmp, i, j;

    for(i = 0; i < length-1; i++)
    {
        for(j = i+1; j < length; j++)
        {
            if(arr[i] > arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    } 
    /* 优化后的选择排序算法 
    for(i = 0; i < length-1; i++)//length个元素需要比较length-1轮 
    {
        int index = i;//假设index为每轮比较后最小的元素下标 ,初始值为每轮第一个元素 

        for(j = i+1; j < length; j++) 
        {
            if(arr[j] < arr[index])//index代表一局内最小的那个 
                index = j;
        }

        if(index != i)
        {
            tmp = arr[index];
            arr[index] = arr[i];
            arr[i] = tmp;
        }

    } */
}

//冒泡排序,每次找到轮内最大的放在本轮的最后位置 
void BubbleSort(int arr[], int length)
{
    int i, j, tmp;

    for(i = 0; i < length-1; i++)
    {
        for(j = 0; j < length-1-i; j++)
        {
            if(arr[j] > arr [j+1])
            {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }

    /*冒泡排序的优化

    bool flag = true; 
    for(i = 0; i < length-1 && flag; i++)
    {
        flag = false;

        for(j = 0; j < length-1-i; j++)
        {
            if(arr[j] > arr [j+1])
            {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
                flag = true;
            }
        }
    }
    */

} 
void main()
{
    int arr[8] = {2,8,5,3,4,7,9,10};
    int i;

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

    BubbleSort(arr, 8);

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值