概述
因为快要找工作了,最近在看左神的算法视频课程,打算用博客的方式记录一下课程中的所有例程。如果有侵权请告知,立即删。
冒泡排序
冒泡排序简单的理解就是:相邻元素依次比较,小的数放前面,大的数放后面。例如 输入数据6 1 7 5 4
6和1进行比较,6大(1小),则顺序变成1 6 7 5 4
同理6和7比较,7大(6小),则顺序不变还是1 6 7 5 4
7和5比较,5小(7大),则顺序为1 6 5 7 4
7和4进行比较,7大(4小),则顺序变成1 6 5 4 7
则数组中最大的数到了最右边,第一轮结果就排好了。依次轮流下来,就可以排好整个数组。可以看出,整个过程的复杂度为O(N*N),因为排完一轮需要N次,一共需要排N轮。
再看看程序
# include <stdio.h>
int main(void)
{
//假设需要排序的数组为a[]
int a[] = {500, 22, 53, -158, 4, 86, 32, 33, 26, -70, 135, -34, 32, 543, 2500};
int n; //存放数组a中元素的个数
int i; //比较的轮数
int j; //每轮比较的次数
int buf_temp;
n = sizeof(a) / sizeof(a[0]); /*a[0]是int型, 占4字节*/
for (i = n-1; i >= 0; i --) //比较n-1轮
{
for (j = 0; j < i; j ++) //每轮比较i次
{
if (a[j] < a[j+1])
{ //进行数据交换
buf_temp = a[j];
a[j] = a[j+1];
a[j+1] = buf_temp;
}
}
}
for (i = 0; i < n; i ++)
{
printf("%d\t", a[i]);
}
printf("\n");
return 0;
}
选择排序
选择排序的思想:在一个长度为N的数组中,先从N个元素中找到最小值与第一位元素进行交换(如果没有比第一位元素还要小,则不需要交换,后面的类推),再从N-1中找到最小值与第二位元素进行交换,,,直至排到N-1位元素(N位元素自动排到最后一位)。因为操作是等差序列,复杂度为O(N*N)。这个例子和冒泡法很类似,也比较简单,这里就不举例子了。直接上代码吧。
# include <stdio.h>
int main(void)
{
int a[] = {500, 22, 53, -158, 4, 86, 32, 33, 26, -70, 135, -34, 32, 543, 2500};
int n; //存放数组a中元素的个数
int i; //比较的轮数
int j; //每轮比较的次数
int buf_temp;
int temp_min;
n = sizeof(a) / sizeof(a[0]); /*a[0]是int型, 占4字节*/
for (i = 0; i< n-1; i ++) //比较n-2轮
{
temp_min = i; //i次循环时最小值都是第i个
for (j = i+1; j < n-1; j ++) //从i+1到n-1个元素进行比较
{
if (a[j] < a[temp_min]) //发现比第i个元素还小,则交换
{
buf_temp = a[j];
a[j] = a[temp_min];
a[temp_min] = buf_temp;
}
}
}
for (i=0; i<n; ++i)
{
printf("%d\t", a[i]);
}
printf("\n");
return 0;
}
插入排序
插入排序的思想类似打扑克牌:从未排序元素部分中,按元素下标,依次抽出一个数,插入已经完成排序的部分,最大值位置。
例如,第一步,先将数组a[N]分成已经排序的和未排序的。因为一开始,所以a[0]是排好序的,a[1]至a[N-1]是未排序的。则抽出未排序部分的a[1]放到已经完成排序的部分,a[1]与a[0]进行比较,谁大谁在后面。这样a[0]、a[1]就排好序了。第二步,数组a[N]分成已经排序的和未排序的。a[0]和a[1]已经排好序了,a[2]和a[N-1]未排序,则抽出a[2]放到a[0]和a[1]中进行依次比较,进行排序。依次类推,则抽出a[3]、a[4]、、、一直到a[N-1]。
时间复杂度计算:依然是一个等差序列,复杂度为O(N*N)。
程序如下:
# include <stdio.h>
int main(void)
{
int a[] = {500, 22, 53, -158, 4, 86, 32, 33, 26, -70, 135, -34, 32, 543, 2500};
int n; //存放数组a中元素的个数
int i; //比较的轮数
int j; //每轮比较的次数
int temp_min;
n = sizeof(a) / sizeof(a[0]); /*a[0]是int型, 占4字节*/
for (i = 1; i< n; i ++) //比较n-1轮
{
temp_min = a[i]; //未完成排序的中,需要插入完成排序的元素,就是它了
j = i-1;
while((j >= 0) && (a[j] > temp_min))//准备插入的元素与完成排序的元素依次比较
{
a[j+1] = a[j]; //但比较的顺序是从后往前
j--; //发现有比它大的数,数组就往后挪一下,留出空位置
}
a[j+1] = temp_min; //没有比它还小的,就把它放在那个空位置上去
} //空位置的下标j--了,需要加1,才能到空位置上去
for (i=0; i<n; ++i)
{
printf("%d\t", a[i]);
}
printf("\n");
return 0;
}