第27课 - 初始斗转
1. 选择排序
每一次选出前面的元素最小的元素作为第i个元素。
程序:
#include <stdio.h>
void println(int array[], int len)
{
int i = 0;
for(i=0; i<len; i++)
{
printf("%d ", array[i]);
}
printf(" ");
}
void swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
void SelectionSort(int array[], int len) // O(n*n)
{
int i = 0;
int j = 0;
int k = -1;
for(i=0; i<len; i++)
{
k = i;
for(j=i; j<len; j++)
{
if( array[j] < array[k] )
{
k = j;
}
}
swap(array, i, k);
}
}
int main()
{
int array[] = {21, 25, 49, 25, 16, 8};
int len = sizeof(array) / sizeof(*array);
println(array, len);
SelectionSort(array, len);
println(array, len);
return 0;
}
2. 插入排序
当插入第i个元素的时候,前面的元素都已经排列好了。我们用V[i]的关键字与前面的关键字进行比较,找到插入位置,将V[i]插入即可。原来位置上的对象向后顺移。
程序:
#include <stdio.h>
void println(int array[], int len)
{
int i = 0;
for(i=0; i<len; i++)
{
printf("%d ", array[i]);
}
printf(" ");
}
void swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
void InertionSort(int array[], int len) // O(n*n)
{
int i = 0;
int j = 0;
int k = -1;
int temp = -1;
for(i=1; i<len; i++)
{
k = i;
temp = array[k];
for(j=i-1; (j>=0) && (array[j]>temp); j--)
{
array[j+1] = array[j];
k = j;
}
array[k] = temp;
}
}
int main()
{
int array[] = {21, 25, 49, 25, 16, 8};
int len = sizeof(array) / sizeof(*array);
println(array, len);
InertionSort(array, len);
println(array, len);
return 0;
}
3. 冒泡排序
设代排序的数据元素有n个,最多作n-1趟。走一趟选一个。
程序:
#include <stdio.h>
void println(int array[], int len)
{
int i = 0;
for(i=0; i<len; i++)
{
printf("%d ", array[i]);
}
printf(" ");
}
void swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
void BubbleSort(int array[], int len) // O(n*n)
{
int i = 0;
int j = 0;
int exchange = 1;
for(i=0; (i<len) && exchange; i++)
{
exchange = 0;
for(j=len-1; j>i; j--)
{
if( array[j] < array[j-1] )
{
swap(array, j, j-1);
exchange = 1;
}
}
}
}
int main()
{
int array[] = {21, 25, 49, 25, 16, 8};
int len = sizeof(array) / sizeof(*array);
println(array, len);
BubbleSort(array, len);
println(array, len);
return 0;
}
小结:
选择排序,插入排序以及冒泡排序的算法思想简单,而且算法的时间复杂程度都是O(n2)。
这三种排序的算法都是稳定的。