八大排序算法
http://blog.csdn.net/hguisu/article/details/7776068/
http://blog.sina.com.cn/s/blog_77795cad01011txt.html 时间复杂度
快速排序算法的时间复杂度为什么是O(NlogN),还有O(N^2) 参考 http://blog.csdn.net/iihtd/article/details/51162106
1.插入排序—直接插入排序(Straight Insertion Sort)
#include <stdio.h> /* 从大到小排序 */ void InsertSort(int iArray[], int iLen) { int m = 0,n = 0; int iSentry; /* 哨兵值 */ for(m = 1; m < iLen; m++) { if(iArray[m] > iArray[m-1]) { /* 直接插入排序要确定一个哨兵 */ iSentry = iArray[m]; n = m-1; while(iSentry > iArray[n]) { iArray[n+1] = iArray[n];/* 元素后移*/ n--; if(n < 0 ) break; } iArray[n+1] = iSentry;/* 哨兵值的赋值 */ } } } int main(void) { int iArray[] = {1,55,2,3,6,5,90,5,2,100,102,9,103,444,5555}; int iLen = 0; int i; iLen = sizeof(iArray)/sizeof(iArray[0]); InsertSort(iArray,iLen); for(i = 0; i < iLen; i++) { printf("%d\n", iArray[i]); } return 0; }
效率:
时间复杂度:O(n^2)
2.交换排序—冒泡排序(Shell`s Sort)
/* 冒泡排序 */ void BubbleSort(int iArray[], int iLen) { int m; int n; int iTemp; for(m = 0; m < iLen-1; m++) { for(n = 0; n < (iLen - m - 1); n++) { if(iArray[n] < iArray[n+1]) { iTemp = iArray[n+1]; iArray[n+1] = iArray[n]; iArray[n] = iTemp; } } } }
3.选择排序—简单选择排序
/* 选择排序 */ /* 从数组中选择最大的数赋值给第一个元素,然后在剩下的元素中选择最大的数赋值给第二个元素*/ int SelectMax(int iArray[], int iLen, int iStart) { int i; int iMaxNum; iMaxNum = iStart; for(i = iStart+1; i < iLen; i++) { if(iArray[iMaxNum] < iArray[i]) { iMaxNum = i; } } return iMaxNum; } void SelectSort(int iArray[], int iLen) { int m; int iMaxNum = 0; int iTemp; /* 从第一个元素开始 */ for(m = 0;m < iLen;m++) { /* 找到最大的值 */ iMaxNum = SelectMax(iArray, iLen, m); if(iMaxNum != m) { iTemp = iArray[m]; iArray[m] = iArray[iMaxNum]; iArray[iMaxNum] = iTemp; } } }
void SelectSort1(int iArray[], int iLen) { int m,n; int iMaxNum; int iTemp; for(m = 0; m < iLen; m++) { iMaxNum = m; for(n = m+1; n < iLen; n++) { if(iArray[iMaxNum] < iArray[n]) { iMaxNum = n; } } iTemp = iArray[iMaxNum]; iArray[iMaxNum] = iArray[m]; iArray[m] = iTemp; } }