冒泡排序
- 第一个数与第二个数对比,第一个数大于第一个数就调换,接着第二个数跟第三个数对比,第二个数大于第三个数就调换,如此类推到最后一个数。

- 第一个数与第二个数对比,第一个数大于第一个数就调换,接着第二个数跟第三个数对比,第二个数大于第三个数就调换,如此类推到倒数第二个数。
- 如此类推……

其实每一次遍历完成就是将当前区间内的最大值往最前靠。
时间复杂度为O(n2),空间复杂度为O(1)
void BubbleSort(int* pArray, int nCount) {
if(pArray == NULL || nCount == 0) {
return ;
}
for(int i=0; i<nCount; i++) {
for(int j=0; j<nCount-1-i; j++) {
if(pArray[j] > pArray[j+1]) {
int nTmp = pArray[j];
pArray[j] = pArray[j+1];
pArray[j+1] = nTmp;
}
}
}
}
插入排序
- 将数组分为两个区间,一个区间为有序区间,另一个区间为无序区间,从无序区间拿一个一个数跟有序区间的数对比,然后插入到相应到位置上。
- 从第二个数开始,第二个数跟第一个数做对比,插入到相应位置,接着第三个数跟第一、二个数对比,插入到相应位置,如此类推到最后一个数

- 插入之前,需要将当前的数之前的数与插入位置的数往后移动一位,空出一个位置插入当前的数
时间复杂度为O(n2),空间复杂度为O(1)
void InsertionSort(int* pArray, int nCount) {
if(pArray == NULL || nCount == 0) {
return ;
}
for(int i=1; i<nCount; i++) {
int nTmp = pArray[i];
int j = i-1;
for(; j>=0; j--) {
if(nTmp < pArray[j]) {
pArray[j+1] = pArray[j];
}
else {
break;
}
}
pArray[j+1] = nTmp;
}
}
选择排序
- 每次找到无序区间内的最小值,调换到有序数组的区间内。
- 从第一位开始找到数组里面的最小值,与第一位的数调转
- 从第二位开始找到数组里面的最小值,与第二位的数调转
- 如此类推到最后一位数

时间复杂度为O(n2),空间复杂度为O(1)
void SelectionSort(int* pArray, int nCount) {
if(pArray == NULL || nCount == 0) {
return ;
}
for(int i=0; i<nCount-1; i++) {
int nMin = pArray[i];
int nMinIndex = i;
for(int j=i+1; j<nCount; j++) {
if(nMin > pArray[j]) {
nMin = pArray[j];
nMinIndex = j;
}
}
pArray[nMinIndex] = pArray[i];
pArray[i] = nMin;
}
}