zoukankan      html  css  js  c++  java
  • 【算法】简单选择排序 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;//把最小的元素与最前的进行交换 
    	}
    }






  • 相关阅读:
    保险行业电话外呼型呼叫中心方案
    12355青少年服务台呼叫中心解决方案
    未能找到类型集或命名空间名称 "xxxxxx" (是否缺少using 指令或引用?)
    Smarty中section的使用
    什么是Asterisk,它如何帮助我们的呼叫中心?
    高效呼叫中心的8个健康工作习惯
    Python 爬起数据时 'gbk' codec can't encode character 'xa0' 的问题
    Python 网页解析器
    Python 爬虫入门3种方法
    Python open 读写小栗子
  • 原文地址:https://www.cnblogs.com/Ahair/p/5005571.html
Copyright © 2011-2022 走看看