-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.
第一:
选择排序
基本思想:
每一趟 ( 例如第 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");
}
//交换数组里面2个指定元素的位置
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循环一直遍历数组
for(i=0; i<len; i++)//当前所找元素最小下标
{
k = i;
for(j=i; j<len; j++)//k表示最小元素所在位置
{
if( array[j] < array[k] )
{
k = j;
}
}
//将最小元素放在i的位置
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;
}
第二:
插入排序
基本思想:
当插入第 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];//暂存数组元素temp,存入要插入的元素
for(j=i-1; (j>=0) && (array[j]>temp); j--)
{
array[j+1] = array[j];//向后挪动
k = j;
}
array[k] = temp;//在k的位置插入新元素
}
}
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;
}
第三:
冒泡排序
基本思想:
为 设待排数据元素序列中的元素个数为 n 。 最多作 n- 1 趟 , i = 1, 2, … … , n - 1 。 在第 i 趟中从后向前 , j = n-1, n- 2, … , i 两两 比较 V[j-1] 和 V[j] 的关键字 。 如果发生逆序 , 则交换 V[j- 1] 和 V[j] 。
冒泡排序的实现
#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 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(n*n )量级.
? 这3 种排序算法的排序结果都是稳定的.