目录
C/C++实现
#include <stdio.h>
#include <cstring>
#define MAX_NUM 10
int array[10]={25,30,10,2,9,4,11,55,46,23};
//冒泡排序,时间复杂度O(n^2),空间复杂度O(1)
void MaoPaoSort(int arr[]){
int temp;
for (int i = MAX_NUM; i > 0; i--)
{
for (int j = 0; j < i-1; j++)
{
if (arr[j] < arr[j+1])
{
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
printf("\n冒泡排序结果:");
for(int i=0;i<MAX_NUM;i++)
printf("%d\t",arr[i]);
}
//简单选择排序,平均时间复杂度O(n^2) ,平均复杂度O(1)
/*
*简单排序的思想和冒泡排序的思想的区别是冒泡排序是相邻关键字两两比较,如果小,则直接替换,
*可能在一轮循环会进行多次值交换。而简单选择排序法是一轮循环找到最小关键字下标,最后进行最多一次替换。
*/
void SimpleSelectionSort(int arr[]){
int temp=0;
for(int i=0;i<MAX_NUM;i++){
int min = i; //最小的脚码
for(int j = i+1;j<MAX_NUM;j++){
if(arr[min]<arr[j])
min = j;
}
if(min != i){ //如果不相等则交换
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
printf("\n简单选择排序结果:");
for(int i=0;i<MAX_NUM;i++)
printf("%d\t",arr[i]);
}
//直接插入排序,平均时间复杂度O(n^2) 空间复杂度O(1)
/*
*假设待排序的元素存放在数组 Data[0..n-1] 中,排序过程中的某一时刻,Data 被划分成两个子区间 Data[0..i-1]
*和 Data[i..n-1](刚开始时 i=1,有序区只有 Data[0] 一个元素),其中,前一个子区间是已排好序的有序区,
*后一个子区间则是当前未排序的部分,称其为无序区。直接插入排序的一趟操作是将当前无序区的开头元素 Data[i]
*(1 <= i <= n-1)插入到有序区 Data[0..i-1] 中适当的位置上,使 Data[0..i] 变为新的有序区,如下图所示。
*这种方法通常称为增量法,因为它每趟操作使有序区增加一个元素。
*/
void InsertSort(int arr[]){
int temp,j;
for(int i=1;i<MAX_NUM;i++){
temp = arr[i];
for(j=i-1;temp>=array[j]&&j>=0;j--){
arr[j+1] = arr[j];
}
arr[j+1] = temp;
}
printf("\n直接插入排序结果:");
for(int i=0;i<MAX_NUM;i++)
printf("%d\t",arr[i]);
}
int main(void){
MaoPaoSort(array);
SimpleSelectionSort(array);
InsertSort(array);
}