选择排序 堆排序: #include<iostream> using namespace std; void print(int*,int); /* *堆排序 */ void sift(int* s,int len,int i) { int j,temp; if((2*i+1) <= len)//有子节点时 { if((2*i+2) > len)//只有左节点 { if(s[i] > s[2*i+1]) //父节点和左子节点互换 { temp = s[2*i+1]; s[2*i+1] = s[i]; s[i] = temp; } } else//左右节点都有 { if(s[2*i+1] > s[2*i+2]) //比较左节点大于右节点 j = 2*i+2; else j = 2*i+1; if(s[i] > s[j]) //如果父节点大于左右节点中较大的节点,则互换 { temp = s[j]; s[j] = s[i]; s[i] = temp; sift(s,len,j);//再判断后序节点 } } } } void heapSort(int* s,int len) { int begin,i,temp; begin = len / 2 - 1; for(i = begin;i >= 0;i--)//建立初始堆 sift(s,len,i); //完成堆排序,堆排序会将每次得到的最小数和i指向的元素进行交换 //然后在从头元素向下排序,得到次小元素,一共len-1次循环 for(i=len-1;i>=1;i--) { temp = s[i]; s[i] = s[0]; s[0] = temp; sift(s,i-1,0); } } void print(int *s,int len) { int i = 0; for(i=0;i<len;i++) cout << *(s+i) <<" "; cout << endl; } int main() { int list[10] = {49,36,65,97,76,13,27,49,15,77}; // bubbleSort(list,10); // insertSort(list,10); // quickSort(list,0,9); // shellSort(list,10); heapSort(list,10); print(list,10); return 0; } 堆排序算法的时间复杂度为:O(n*ln n) 归并排序: 归并排序算法的时间复杂度为:O(n*ln n)