- 选择排序
- 思想 对于一组给定的记录,经过第一轮比较后得到一个最小的数,然后将该记录与第一个记录进行交换;接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录,并与第二个位置的记录进行交换。
- 示例:{38,65,97,76,13,27,49}
- 第一趟排序后:13[65,97,76,38,27,49]
- 第二趟排序后:13,27[97,76,38,65,49]
- 第三趟排序后:13,27,38[76,97,65,49]
- 第四趟排序后:13,27,38,49[97,65,76]
- 第五趟排序后:13.27.38.49.65[97.76]
- 第六趟排序后:13,27,38,49,65,76,97
- 选择排序是一种不稳定的排序,最好最坏和平均情况下的时间复杂度为
示例代码:
#include<stdio.h>
void selectSort(int *a,int n)
{
int i;
int j;
int temp =0;
int flag =0;
for(i=0;i<n-1;i++)
{
temp = a[i];
flag = i;
for(j = i+1;j<n;j++)
{
if(a[j]<temp)
{
temp = a[j];
flag = j;
}
}
if(flag !=i){
a[flag] = a[i];
a[i ] = temp;
}
}
}
2.插入排序
2.1 对于一组给定的记录,初始时家色号第一个记录自成一个有序数列,其余记录为无序序列;接着从第二个记录开始,按照记录的大小顺序依次将当前处理的记录插入到其之前的有序序列中,直至最后一个记录插入到有序序列中为止。
2.2 以数组{38,65,97,76,13,27,49}为例:
直接插入排序的具体步骤如下:
第一步插入38后:[38]65,97,76,13,27,49
第二步插入65后: [38,65],97,76,13,27,49
第三步插入97后:[38,65,97],76,13,27,49
第四步插入76后:[38,65,76,97],13,27,49
第五步插入13后:[13,38,65,76,97]27,49
第六步插入27后:[13,27,38,65,76,97]49
第七步插入49后:[13,27,38,49,65,76,97
2.3 插入排序是一种稳定的排序方法,最好情况下时间复杂度为,最坏情况下时间复杂度为,平均情况下时间复杂度为.空间复杂度为O(1)
3.冒泡排序
3.1 思想: 单向冒泡排序的基本思想是:(假设由小到大排序):对于给定的N个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换其位置,进行一轮比较和换位后,n个记录中的最大记录将位于第n位;然后对前(n-1)个记录进行第二轮比较;重复该过程,直到进行比较的记录只剩下一个时为止。
3.2 例子: {36,25,48,12,25,65,43,57}
初始状态:[36,25,48,12,25,65,43,57]
第一趟排序:[25,36,12,25,48,43,57,65]
第二趟排序:[25,12,25,36,43,48],57,65
第三趟排序:[12,25,25,36,43],48,57,65
第四趟排序:[12,25,25,36],43,48,57,65
第五趟排序:[12,25,25,]36,43,48,57,65
第六趟排序:[12,25],25,36,43,48,57,65
第七趟排序:[12],25,25,36,43,48,57,65
3.3 冒泡排序是一种稳定的排序算法,最好情况下的时间复杂度为,最坏情况下的时间复杂为,平均情况下时间复杂度为。空间复杂度为O(1)
4 归并排序
4.1 归并排序是利用递归与分治技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列。
4.2 思想 对于给定的一组记录(假设共有n个记录),首先将每两个相邻长度为1的子序列进行归并,得到n/2(向上取整)个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到找到一个有序数列为止。(左右相邻的每两个分一组,确定好大小关系后,依次扩大一个层面,最后合并成本来的表)、
4.3 例子: {49,38,65,97,76,13,27} (假设要求为升序排列)
初始关键字:[49],[38] [65],[97] [76],[13] [27]
一次归并后:[38 49] [65 97] [13 76] [27]
二次归并后:[38 49 65 97] [13 27 76]
三次归并后:[13,27,38,49,65,76,97]
5. 快速排序
5.1 思想: 假设待排序的数组为a[0]-a[n-1],首先任意选择一个元素,通常为a[0],作为一个基准元素,然后将所有比他小的元素都放在他前面,比他大的元素都放在他后面。最后将这个基准元素所落的i的位置作为分界线,可以将序列分为a[0]-a[i-1] 和a[i+1]--a[n-1]两个部分。一般情况下,设置两个指针,一个为i,一个为j。 j从后往前,i从前往后。
从后边开始找到第一个小于基准元素的数字,然后将这个数字放到基准元素的位置,同样利用I从前往后找到第一个大于基准元素的值,放到刚才指针j指示的位置。然后这样依次扫描。
放一个链接 这个很好快速排序算法-CSDN博客
6. 希尔排序
6.1 希尔排序称为“缩小增量排序”,基本原理为:将待排序的元素分为多个子序列,使得每个子序列的元素个数相对较少,对各个子序列分别进行直接插入排序,待整个排序序列“基本有序后”,在对所有元素进行一次直接插入排序。
有一个序列 然后有一个步长序列,即根据步长,确定分组。 小分组进行排序