1. 程式人生 > 其它 >【R語言】data.frame 分組計數、求和等

【R語言】data.frame 分組計數、求和等

技術標籤:C++Linux

插入排序

1、簡介

直接插入排序是一種最簡單的排序方法,排序過程為:先將第一個元素看作是隻有一個元素的有序子表,然後從第二個元素開始,將待排序元素依次插入到前面有序的子表中,直到全部排序完畢。在整個過程中,前面的元素是已經排序好的列表,後面的元素為待排序處理。

2、程式碼

程式碼如下:

template<class T>
int InsertSort(T *aArray, int aCount)
{
	if(0 == aCount || NULL == aArray)
		return sERROR;
	
	int i = 0, j = 0;
	for(i = 1; i < aCount; i++)
	{
		T temp = aArray[i];
		for(j = i - 1; j >= 0; --j)
		{
			if(temp < aArray[j])
				aArray[j + 1] = aArray[j];		//在有序列表中比temp值大的元素後移
			else
				break;							//temp大於有序表中的最後一位則不需要移動
		}
		aArray[j + 1] = temp;					//跳出內層迴圈後插入在合適的位置
	}
	return sSUCCESS;
}

1、由於需要對不同資料型別的內容進行排序,所以使用了C++的template模板。
2、函式開始會判斷排序的陣列以及陣列的長度。
3、遍歷元素,將第一個元素看作是一個有序的列表,從第二個元素開始將元素與有序部分中的元素比較找到合適的插入位置,將插入位置後的元素依次後移一個位置。
4、最終就會得到排序好的陣列。

3、引用

使用方法如下:

int main(int argc, char ** argv)
{
	int iArray[] = { 49,38,65,97,76,13,27,49,10 };
	int iSize = sizeof(iArray) / sizeof(int);
	
	cout <<"排序前:"<<endl;
	PrintArray(iArray, iSize);
	
	InsertSort(iArray, iSize);
	
	cout <<"排序後:"<<endl;
	PrintArray(iArray, iSize);
	
	double dArray[] = { 12.3,90.0,123.44,22.5,99.4,34.6,23.3,78.5,20.0 };
	int dSize = sizeof(dArray) / sizeof(double);
	
	cout <<"排序前:"<<endl;
	PrintArray(dArray, dSize);
	
	InsertSort(dArray, dSize);
	
	cout <<"排序後:"<<endl;
	PrintArray(dArray, dSize);
	
	return sSUCCESS;
}

1、第一部分為int型別的陣列排序。
2、第二部分位double型別的陣列排序。

4、執行結果

在這裡插入圖片描述

5、總結

1、在最好的情況下表中的元素已經是有序表只需要比較不需要移動,這是的時間複雜度是O(n)。
2、最壞的情況下,表中的元素是逆序的比較次數達到最大為:∑ni=2 i,總的移動次數也達到最大為∑ni=2 (i+1)。
3、平均的情況下帶排序的元素是隨機的,此時可以去上訴情況的平均值作為平均情況下的時間複雜度總的比較和移動的平均次數約為n2/4。所以直接插入排序的時間複雜度為O(n2)。
4、排序過程中需要一個輔助空間,所以時間複雜度為O(1)。

6、git地址如下

https://github.com/FengAfra/WorkSpace/tree/dev/Arithmetic/InsertSort