排序算法之简单排序方法
排序的概念:是按照非递减或递增 顺序对一组记录重新进行整队的操作,排序的方法有很多,包括(简单选择排序,直接插入排序,起泡排序)当然也有先进的排序方法包括(归并排序,快速排序,堆排序,基数排序)今天主要分享一下简单排序。包括(直接插入排序,折半插入排序,希尔排序)
直接插入排序
- 插入排序的基本思想:在一个已经排好顺序的子集的基础上,每一步将下一个待排序的记录有序的插入到已经排好的顺序中,直到所有待排全部插入。
- 算法的实现,c语言代码。
void InsertSort(int a[],int n){
int i,j,temp;
for(i=2;i<n;i++) //将各元素插入到已排好序列
if(a[i]<a[i-1]){
//a[i]小于前驱
temp=a[i]; //temp暂存a[i]
for(j=i-1;j>=0&&a[j]>temp;j--){
//检查前面已经排好的
a[j+1]=a[j]; //大于temp的元素向后面挪
}
a[j+1]=temp; //复制到插入位置
}
return;
}
void Printarr(int a[],int n) //输出数组
{
int i;
for(i=0;i<n;i++){
printf("%d",a[i]);
}
return;
}
int main(){
//主函数
int a[]={
1,8,7,5,6};
int n=5;
printf("未排序的数\n");
Printarr(a,n);
printf("\n");
InsertSort(a,n);
printf("排好序的数\n");
Printarr(a,n);
return 0;
}
3.实验结果
空间复杂度O(1)
时间复杂度最好的结果,所有待排数是按照顺序的则O(n)最坏的为O(n2)
折半插入排序
1.折半插入的思想:在直接插入的基础上,通过折半查找的思想,快速寻找要插入的位置优化插入的速度。
2.算法的实现,c语言代码
#include <stdio.h>
void BinSort(int a[],int n){
int i,j,low,high,mid;
int temp=0;
for(i=1;i<n;++i) {
//将各元素插入到已排好序列
low=0,high=i-1;
temp=a[i]; //当前插入元素个temp保存
while(low<=high){
//进行折半查找
mid=(low+high)/2;
if(a[mid]>temp) high=mid-1;
else low=mid+1;
}
//移动元素
for(j=i-1;j>=high+1;--j){
a[j+1]=a[j];
}
a[high+1]=temp;
}
}
void Printarr(int a[],int n) //输出数组
{
int i;
for(i=0;i<n;i++){
printf("%d",a[i]);
}
return;
}
int main(){
//主函数
int a[]={
1,8,7,5,6};
int n=5;
printf("未排序的数\n");
Printarr(a,n);
printf("\n");
BinSort(a,n);
printf("排好序的数\n");
Printarr(a,n);
return 0;
}
3.实验结果
空间复杂度O(1)
时间复杂度最好的结果,所有待排数是按照顺序的则O(n)最坏的为O(n2)
希尔排序
1.希尔排序又称“缩小增量排序”
基本思想:先将整个待排记录序列分割成若干子序列,对每个子序列分别进行直接插入排序,待整个序列中的记录‘’‘基本有序’在对全体进行一次直接插入排序。
2.算法的实现,c语言
#include <stdio.h>
void ShellSort(int a[], int n) //a -- 待排序的数组, n -- 数组的长度
{
int i,j,b; // b为步长,每次减为原来的一半。
for (b = n / 2; b > 0; b /= 2)
{
for (i = 0 ;i < b; i++)
{
for (j = i + b; j < n; j += b)
{
// 如果a[j] < a[j-b],则寻找a[j]位置,并将后面数据的位置都后移。
if (a[j] < a[j - b])
{
int tmp = a[j];
int k = j - b;
while (k >= 0 && a[k] > tmp)
{
a[k + b] = a[k];
k -= b;
}
a[k + b] = tmp;
}
}
}
}
}
void Printarr(int a[],int n) //输出数组
{
int i;
for(i=0;i<n;i++){
printf("%d",a[i]);
}
return;
}
int main(){
//主函数
int a[]={
1,8,7,5,6,};
int n=5;
printf("未排序的数\n");
Printarr(a,n);
printf("\n");
ShellSort(a,n);
printf("排好序的数\n");
Printarr(a,n);
return 0;
}
3.实验结果
空间复杂度O(1)