• 【算法】简单选择排序 O(n^2) 不稳定的 C语言


    简单选择排序

     一、算法描述                                                     

    假设序列中有N个元素:

    1趟找到第1N个元素之间最小的一个,与第1个元素进行交换

    2趟找到第2N个元素之间最小的一个,与第2个元素进行交换

    3趟找到第3N个元素之间最小的一个,与第3个元素进行交换

    m趟找到第mN个元素之间最小的一个,与第m个元素进行交换

    N趟(最后一趟)找到第NN个元素之间最小的一个(即最后一个元素),与第N个元素进行交换(无需交换)

    即每次找到剩下无序序列中元素中最小的,与无序序列最前面的元素交换,逐渐形成第一个元素有序,第一到二个元素有序,第一到三个元素有序。。。。。。。全部元素有序

     二、算法分析                                                     

    有两层循环,共需作 n(n-1)/2 次比较,固时间复杂度为O(n^2)

    且是不稳定的排序算法,空间复杂度为O(1)

    无论序列怎样,都需完成N趟排序,所以最好、最坏和平均情况的执行时间是相同的

     三、算法实现代码                                                 

    定义顺序表代码:

    typedef struct list {
    	int Size;//大小 
    	int Elements[MaxSize];//用数组存放 
    }List;//定义顺序表

    定义简单选择函数代码:

    void Jiandanxuanze(List*lst)
    {
    	int small;//存放最小元素下标
    	int i, j, temp;
    	for (i = 0; i<lst->Size - 1; i++)//最后一次无需执行,共执行Size-1次
    	{
    		small = i;
    		for (j = i + 1; j<lst->Size; j++)
    		{
    			if (lst->Elements[j]<lst->Elements[small])
    				small = j;//找到最小的元素的下标存在small,然后与i进行交换
    		}
    		temp = lst->Elements[i];
    		lst->Elements[i] = lst->Elements[small];
    		lst->Elements[small] = temp;//把最小的元素与最前的即i进行交换 
    	}
    }


     四、实例测试代码                                                 

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define MaxSize 99
    
    typedef struct list {
    	int Size;//大小 
    	int Elements[MaxSize];//用数组存放 
    }List;//定义顺序表
    
    void Jiandanxuanze(List*lst);//函数声明
    
    int main(void) {
    	List a;
    	int i;
    	srand((unsigned)time(NULL)); //随机数种子
    	a.Size = 10;//定义大小为10
    
    	for ( i = 0; i<10;i++)
    	{
    		a.Elements[i] = rand() % 10;//初始化顺序表
    	}
    
    	printf("原表为:");
    	for (i = 0; i < 10;i++)
    	{
    		printf("%d  ", a.Elements[i]);
    	}
    	printf("\n");
    
    	Jiandanxuanze(&a);//调用简单选择函数,修改值需传入地址
    
    	printf("简单选择排序后为:");
    	for (i = 0; i < 10; i++)
    	{
    		printf("%d  ", a.Elements[i]);
    	}
    	getchar();
    	return 0;
    }
    
    
    void Jiandanxuanze(List*lst)
    {
    	int small;//存放最小元素下标
    	int i, j, temp;
    	for (i = 0; i<lst->Size - 1; i++)
    	{
    		small = i;
    		for (j = i + 1; j<lst->Size; j++)
    		{
    			if (lst->Elements[j]<lst->Elements[small])
    				small = j;//找到最小的元素的下标存在small
    		}
    
    		temp = lst->Elements[i];
    		lst->Elements[i] = lst->Elements[small];
    		lst->Elements[small] = temp;//把最小的元素与最前的进行交换 
    	}
    }






  • 相关阅读:
    QT全局热键(用nativeKeycode封装API,不跨平台)
    Android 短信模块分析(二) MMS中四大组件核心功能详解
    一个高效过滤非UTF8字符的C函数(也可用来判断是否utf8)
    Windows-1252对Latin1编码有改变(并不完全兼容),而且Latin1缺失了好多西欧字符(法语,德语,西班牙语都有)
    C++静态库与动态库
    CFBundleName系列参数的含义
    QT完美转换特殊字符的大小写
    Java-继承的应用
    RTTI、虚函数和虚基类的实现方式、开销分析及使用指导(虚函数的开销很小,就2次操作而已)
    delphi如何获得当前操作系统语言环境
  • 原文地址:https://www.cnblogs.com/Ahair/p/5005571.html
Copyright © 2020-2023  润新知