在C语言中,常见的四种排序方法是冒泡排序、插入排序、选择排序和快速排序。以下是它们的优劣比较:

- 优点:实现简单,代码容易理解。对于小规模的数组,效果较好。
- 缺点:时间复杂度较高,最坏情况下需要进行多次交换操作。对于大规模乱序的数组,效果较差。
- 优点:实现简单,代码可读性好。对于基本有序的数组,效果较好。适合小规模或部分有序的数组。
- 缺点:时间复杂度较高,最坏情况下需要进行多次数据的移动操作。对于逆序数组或大规模乱序数组,效果较差。
- 优点:实现简单,主要操作是交换。对于小规模数组,其实际性能可能比较好。
- 缺点:时间复杂度较高,每轮需要遍历剩余未排序部分找到最小值。对于大规模乱序数组,效果较差。
- 优点:具有较高的平均时间复杂度,性能较好。常被应用于实际排序问题中。
- 缺点:最坏情况下时间复杂度较高,可能退化为O(n^2)。可能会对内存产生较大需求。
综上,各种排序算法的选择应根据实际情况来决定。对于小规模或基本有序的数组,冒泡排序、插入排序、选择排序等简单的排序方法可能适用。对于需要在海量数据中高效排序的场景,快速排序通常是一个更好的选择。另外,还有其他高级的排序算法如归并排序、堆排序等,也可以根据实际需求进行选择。
选择排序的时间复杂度是定死的,就是O(n^2),与数据的输入状态无关。因为对于选择排序,当我们从乱序的区间中找极值时,总是一味的去遍历这个乱序的区间,直到乱序的区间遍历完成后,我们才能确定极值。
插入排序的时间复杂度与数据的输入有关,当初始时给你的数据就是有序的,那么这种状态就是插入排序最好的情况,时间复杂度为O(n),因为对于当前要插入的数x1来说,我们在从后往前遍历乱序区间时,只要找到了x1应该待的位置,就不用在遍历乱序区间中剩下的元素了,那么对于这种最好的情况,我们每次进行乱序区间遍历操作的时间复杂度就会是O(1),一共进行n次乱序区间的遍历操作,总的时间复杂度为O(n)。
从另一个方面来看,我们认为插入排序比选择排序更加聪明,因为插入排序不会做多余的工作,而选择排序会把所有的工作都做完。
选择排序是脱机的排序算法,何为脱机算法,就是必须一次性把数据全部给你后,你这个算法才能够执行,而对于选择排序来说,就是脱机的,必须把所有的数据全部给你后,你才能进行选择排序。
首先,插入排序选定当前排序位置后,是和前面的有序列(有序列就是前面已经排好序的)进行比较排序;而选择排序是当前排序位置和后面的无序列(就是剩下的还没有排序的)进行排序比较的。
其次,插入排序是前面有序列两两进行位置交换,而选择排序是当前位置和找到的目标位置直接进行交换(可谓一步到位)。