-选择排序
基本思想:每一趟(例如第i趟,i=0,1。。。n-2)在后面n-i个待排序的数组元素中选出关键字最小的元素,作为有序元素序列的第i个元素。
描述,遍历整个数组,从整个无序数组中找到最小的元素,找到一个最小的元素,放到有序数列中,然后在从无序数组中找到最小的一个元素,循环下去,遍历完整个数组。
程序实现:
#include <stdio.h>
void println(int array[], int len)
{
int i = 0;
for(i=0; i<len; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
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为第一个元素,一次和后面的元素比较,选出小的,然后将最小值的下标作为下次比较对象的起始点
{
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;
}
时间复杂度为O(n*n)
-插入排序
基本思想:当插入第i(i>=1)个元素的时候,前面的v[0],v[1].....v[i-1]已经排好序,这时用v[i]与关键字v[i-1],v[i-2],....的关键字进行比较,找到插入位置将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("\n");
}
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;
}