排序算法動圖詳解與代碼實現(插入排序篇)

1.直接插入排序

思想:基於已排序好的有序表,從有序元素的下一個元素開始,從後向前掃描,如果已排序的元素大於新元素,則已排序元素後移一位,直到找到已排序的元素小於或者等於新元素的位置,將新元素插入到該位置後,重複循環至所有元素有序。
在這裏插入圖片描述優點:穩定,迅速,只需用到O(1)的額外空間的排序。

缺點:比較次數不一定,數據量龐大時移動量大。

代碼實現

void insert_sort(int* arr,int len)
{
    if(arr == NULL || len < 0)
        return ;
    int j=0;
    int tmp = 0;
    for(int i=1;i<len;i++)
    {
        tmp = arr[i];//待插入元素
        for(j=i-1;j>=0;--j)
        {
            if(arr[j] < tmp)
                break;//若待查入元素大於有序元素,跳出
            arr[j+1] = arr[j];//向後移動有序元素
        }
        arr[j+1] = tmp;//插入元素
    }   
}

2.希爾排序(縮小增量排序)

思想:確定一個增量序列計算方法:n/2取整,其中n爲間隔元素數,首次計算n爲元素個數),將原始序列分割成間隔爲n的n個子序列,分別進行直接插入排序,然後重新計算n的值再進行排序,直到n=1時進行最後一次排序。

在這裏插入圖片描述
優點:快,移動元素少。

缺點:不穩定。

代碼實現

Void ShellSort(int a[],int length) 
{ 
  int i,j; 
  int temp; 
  int increment=length; //初始化間隔值
  do{ 
  	increment=increment/2; 
	for(i=increment;i<length;i++) 
	{ 
		if(a[i]<a[i-increment]) 
		{ 
			temp=a[i]; 
			for(j=i-increment;j>=0 && a[j]>temp;j-=increment) 
			{ 
				a[j+increment]=a[j]; 
			} 
			a[j+increment]=temp;
		 } 
	} 
	}
while(increment>1); 
}

3.二者複雜度比較

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章