一、冒泡排序
1、排序算法分为交换类排序,插入类排序,选择类排序,归并类排序
2、交换排序分为:
1)、冒泡排序
2)、快速排序
3、冒泡排序:
(1)、冒泡排序的基本思想是:
从后往前(或从前往后)两两比较相邻元素的值,(若A[j-1]>A]),则交换它们,直到序列比较完。我们称它为第一趟冒泡,结果是将最小的元素交换到待排序列的第一个位置。关键字最小的元素如气泡一般逐渐往上“漂浮”直至“水面”。下一趟冒泡时前一趟确定的最小元素不再参与比较,每趟冒泡的结果是把序列中的最小元素放到了序列的最终位置.……..这样最多做n-1趟冒泡就能把所有元素排好序。
冒泡排序动画网址:https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
4、代码步骤:
首先我们通过随机数生成10个元素,通过随机数生成,我们可以多次测试排序算法是否正确,然后打印随机生成后的元素顺序,然后通过冒泡排序对元素进行排序,然后再次打印排序后的元素顺序;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef int ElemType;
typedef struct{
ElemType *elem;//存储元素的起始地址
int TableLen;//元素个数
}SSTable;
void ST_Init(SSTable &ST, int len)
{
ST.TableLen = len;
ST.elem = (ElemType *) malloc(sizeof(ElemType)*ST.TableLen);//申请一块堆空间,当数组来使用int i;
int i;
srand(time(NULL));//随机数生成,每一次执行代码就会得到随机的 10个元素
for(i=0;i<ST.TableLen;i++)
{
ST.elem[i]=rand()%100;//生成的是 0-99之间
}
}
//打印数组中的元素
void ST_print(SSTable ST)
{
for (int i=0; i < ST.TableLen;i++)
{
printf("%3d", ST.elem[i]);
}
printf("\n");
}
//交换两个元素
void swap(int &a,int &b)
{
ElemType tmp;
tmp=a;
a=b;
b=tmp;
}
//往往都是使用两层循环的
//有限去写内层循环,再去写外层循环
void BubbleSort(ElemType *A,int n)
{
int i,j;
bool flag;
for(i=0;i<9;i++)//外层循环控制的是有序数的数目
{
for(j=n-1;j>i;j--)//内层循环控制比较和交换
{
if(A[j-1]>A[j])
{
swap(A[j-1],A[j]);
flag=true;
}
}
}
if(false==flag)
{
return;
}
}
int main() {
SSTable ST;
ST_Init(ST,10);//初始化
ElemType A[10]={64,94,95,79,69,84,18,22,12,78};
//内存 copy接口,当你 copy整型数组,或者浮点型时,要用memcpy,不能用 strcpy,初试考 memcpy概率很低
memcpy(ST.elem,A,sizeof(A));//这是为了降低调试难度,每次数组数据固定而设计的
ST_print(ST);//随机后的结果打印
BubbleSort(ST.elem,10);
ST_print(ST);
return 0;
}
5、时间复杂度与空间复杂度:
时间复杂度其实就是程序实际的运行次数,可以看到内层是>i,外层i的值是从0到N-1,所以程序的总运行次数是1+2+3+…+(N-1),即从1 一直加到N-1,这是等差数列求和,得到的结果是N(N-1)/2,即总计运行了这么多次,忽略了低阶项和高阶项的首项系数,因为时间复杂度为(㎡)。因为未使用额外的空间(额外空间必须与输入元素的个数 N相关),所以空间复杂度为 (1)如果数组本身有序,那么就是最好的时间复杂度 (n).