直接插入排序
基本思想
在已经排好序的子集的基础上,每一步将下一个待排序的记录有序地插入到已排好序的记录子集中。可以设置一个监视哨r[0],始终存放待插入的记录,还可以防止越界。
空间复杂度:O(1)
时间复杂度:最好情况:O(n) 最坏情况:O(n^2)
算法稳定性:稳
代码实现
这里不设置监视哨。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void InsertSort(); //插入排序
void Input(); //输入数字
void Output(); //输出数字
int arr[MAXSIZE];
int count = 0;
void InsertSort(){
int temp,j;
for (int i = 1; i < count; i++)
{
if (arr[i] < arr[i-1])
{
temp = arr[i]; //temp存放待插入数
for (j = i - 1;j >= 0 && arr[j] > temp;--j)
arr[j+1] = arr[j]; //将大于temp的数字依次右移
arr[j+1] = temp;
}
}
}
//输入函数
void Input(){
int x,i;
char s;
printf("please input less than 100 numbers, end with enter:\n");
for (i = 0; s != '\n'; i++)
{
scanf("%d",&arr[i]);
s = getchar();
count++;
}
}
//输出函数
void Output(){
printf("sorted numbers:\n");
for (int i = 0; i < count; i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
}
int main(){
Input();
InsertSort();
Output();
system("pause");
return 0;
}
运行结果:
希尔排序
基本思想
将待排序表先分割成若干形如L[i,i+d,i+2d,…,i+kd]的特殊子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1。即先追求表中元素部分有序,再逐渐逼近全局有序。
空间复杂度:O(1)
时间复杂度:和增量序列的选择有关,目前无法用数学手段证明确切的时间复杂度,最坏时间复杂度为O(n^2)
算法稳定性:不稳定
适用性:仅适用于顺序表,不适用于链表
代码实现
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void ShellSort(); //希尔排序
void Input(); //输入数字
void Output(); //输出数字
int arr[MAXSIZE];
int count = 0;
void ShellSort(){
int d; //增量,每轮/2,直到d=1
int j,temp;
for ( d = count/2; d >= 1; d = d/2)
for (int i = d ; i <= count; ++i)
if (arr[i] < arr[i-d])
{
temp = arr[i];
for ( j = i-d; j >=0 && temp < arr[j] ; j-=d)
arr[j+d] = arr[j];
arr[j+d] = temp;
}
}
//输入函数
void Input(){
int x,i;
char s;
printf("please input less than 100 numbers, end with enter:\n");
for (i = 0; s != '\n'; i++)
{
scanf("%d",&arr[i]);
s = getchar();
count++;
}
}
//输出函数
void Output(){
printf("sorted numbers:\n");
for (int i = 1; i <= count; i++){
printf("%d\t",arr[i]);
}
printf("\n");
}
int main(){
Input();
ShellSort();
Output();
system("pause");
return 0;
}
运行结果: