排序算法之简单排序方法

排序算法之简单排序方法

排序的概念:是按照非递减或递增 顺序对一组记录重新进行整队的操作,排序的方法有很多,包括(简单选择排序,直接插入排序,起泡排序)当然也有先进的排序方法包括(归并排序,快速排序,堆排序,基数排序)今天主要分享一下简单排序。包括(直接插入排序,折半插入排序,希尔排序)

直接插入排序

  1. 插入排序的基本思想:在一个已经排好顺序的子集的基础上,每一步将下一个待排序的记录有序的插入到已经排好的顺序中,直到所有待排全部插入。
  2. 算法的实现,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)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44518702/article/details/109811107
今日推荐