目录1.直接选择排序介绍1.1定义1.2基本原理1.3时间复杂度1.4空间复杂度1.5优缺点2.代码实现2.1代码设计2.2代码实现1.直接选择排序介绍1.1定义直接选择排序是指...
1. 直接选择排序介绍
1.1 定义
直接选择排序是指每次都从剩余数据中选出最大或者最小的,将其排在已经排好的有序表后面。
1.2 基本原理
每次从无序表中选择最小(或最大)元素,将其作为首元素,知道所有元素排完为止。将一个有n个元素的数组从小到大排序,第一次从R[0] ~ R[n-1]中选取最小值,与R[0]交换,第二次从R[1] ~ R[n-1]中选取最小值,与R[1]交换,…,第i次从R[i-1] ~ R[n-1]中选取最小值,与R[i-1]交换,…,第n-1次从R[n-2] ~ R[n-1]中选取最小值,与R[ n -2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
下面的动图非常清晰的诠释了直接插入排序的过程:
排序算法详解" src="https://pic.womengda.cn/imgfile/2209/1B3292F242Z-35947.gif" />
1.3 时间复杂度
最好的情况是数组所有元素已经是有序排列,移动次数为0;
最差的情况是数组所有元素全部反序,移动次数为3(n-1)。
无论最好与最差情况,在排序时所有待排元素均需与后面的元素进行比较,比较次数为:
(n-1)+(n-2)+ …+2+1= n(n-1)/2
因此,直接插入排序的平均时间复杂度为O( n 2 n^2 n2) 。
1.4 空间复杂度
直接选择排序仅需一个存储空间用于记录交换的暂存单元,因此空间复杂度为:O(1) 。
1.5 优缺点
优点:直接选择排序算法简单直观,当待排序记录数量n很小时,局部有序时,较为适用。
缺点:不稳定,由于直接选择排序是以最大或最小值直接与最前方未排序的键值交换,数据排序顺序很有可能被改变。
2. 代码实现
2.1 代码设计
a. 实现直接插入排序需要设计两层循环,整个数组为外循环,后面未排列好的无序元素为内循环;
b. 使用变量minIndex存储最小值的数组元素下标,依次遍历无序元素,找出最小元素下标;
c. 将最小元素与无序元素的首元素进行交换,无序元素个数减1,相应i加1;
d. 重复b和c两步操作,直至i=n-1,即无序元素个数为0,则排序完成。
2.2 代码实现
#include <stdio.h>
void printArray(int array[], int size) {
int i;
for (i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
void chooseSort(int array[],int n)
{
int i,j;
int minIndex,temp,num;
for(i=0;i<n-1;i++)
{
minIndex=i;
for(j=i+1;j<n;j++)
{
if(array[j]<=array[minIndex])
{
minIndex=j;
}
}
if(i!=minIndex)
{
temp=array[minIndex];
array[minIndex]=array[i];
array[i]=temp;
}
printArray(array, n);
js}
}
int main(void)
{
int array[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
printArray(array,sizeof(array)/sizeof(int));
chooseSort(array,sizeof(array)/sizeof(int));
printf("\n");
return 0;
}
运行结果:
3 44 38 5 47 15 36 26 27 2 46 4 19 50 48
2 44 38 5 47 15 36 26 27 3 46 4 19 50 48
2 3 38 5 47 15 36 26 27 44 46 4 19 50 48
2 3 4 5 47 15 36 26 27 44 46 38 19 50 48
2 3 4 5 47 15 36 26 27 44 46 38 19 50 48
2 3 4 5 15 47 36 26 27 44 46 38 19 50 48
2 3 4 5 15 19 36 26 27 44 46 38 47 50 48
2 3 4 5 15 19 26 36 27 44 46 38 47 50 48
2 3 4 5 15 19 26 27 36 44 46 38 47 50 48
2 3 4 5 15 19 26 27 36 44 46 38 47 50 48
2 3 4 5 15 19 26 27 36 38 46 44 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 50 48
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50
到此这篇关于C语言直接选择排序算法详解的文章就介绍到这了,更多相关C语言直接选择排序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
本文标题为:C语言直接选择排序算法详解
基础教程推荐
- 详解c# Emit技术 2023-03-25
- C语言 structural body结构体详解用法 2022-12-06
- C语言基础全局变量与局部变量教程详解 2022-12-31
- 一文带你了解C++中的字符替换方法 2023-07-20
- C++详细实现完整图书管理功能 2023-04-04
- C++中的atoi 函数简介 2023-01-05
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- C/C++编程中const的使用详解 2023-03-26
- 如何C++使用模板特化功能 2023-03-05
- C利用语言实现数据结构之队列 2022-11-22