#include<stdio.h> #include<stdlib.h> /* p是循环输出的下表*/ int p=0; /*堆调整算法*/ /* r[]数组 , 根结点的编号为k,最后一个结点的编号为m */ void Sift(int r[ ], int k, int m) { int i, j, temp; p++;i = k; j =2 * i; /* p是循环输出的下表 i是被筛选结点,j是结点i的左孩子*/ while (j <= m) /*筛选还没有进行到叶子*/ { if (j < m-1 && r[j] < r[j+1]) j++; /*比较i的左右孩子,j指向较大者*/ if (r[i] > r[j]) break; /*根结点大于左右孩子中的较大者*/ else { temp = r[i]; r[i] = r[j]; r[j] = temp; /*将根结点与结点j交换*/ i = j; j = 2 * i; /*被筛结点位于原来结点j的位置*/ } } /*输出每一次 调整的代码*/ printf("NO.%d line: ", p); for(i = 1; i< 7 ;i++) { printf("%3d",r[i]); } printf(" ---------------------------------- "); } /*堆排序算法*/ void HeapSort(int r[ ], int n) /* r[0]为交换的临时单元*/ { int i; /*初始建堆,从最后一个分支结点至根结点*/ for (i = n/2; i >= 1; i--) Sift(r, i, n) ; for (i = 1; i < n; i++) { r[0] = r[1]; r[1] = r[n-i+1]; r[n-i+1] = r[0]; /*交换r[1]和r[n-i+1]*/ Sift(r, 1, n-i); /*对r[1]~r[n-i]重建堆*/ } } /*主函数*/ int main() { int i=0; int r[]={0,55,90,17,87,30,66}; /* 排序前的数 */ printf("Heap sort before:"); for(i = 1; i< 7; i++) printf("%3d", r[i]); /* 输出排序后的数 */ printf(" heap sort after: "); HeapSort(r, 6); system("color 4E"); system("pause"); return 0; }
c插入排序
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void InsertSort(int r[ ], int n) /*r[0]用作暂存单元和监视哨*/ 5 { 6 int i, j; 7 for (i = 2; i <= n; i++) 8 { 9 r[0] = r[i]; /*暂存待插记录,设置哨兵*/ 10 for (j = i - 1; r[0] < r[j]; j--) /*寻找插入位置*/ 11 r[j + 1] = r[j]; 12 r[j + 1] = r[0]; 13 } 14 } 15 int main() 16 { 17 int i; 18 int r[]={0,12,15,9,20,6,31,24}; 19 printf("排序之前的元素是"); 20 for(i = 1; i< 8; i++) 21 printf("%3d", r[i]); 22 printf(" 排序后的元素是:"); 23 InsertSort(r, 7); 24 for(i = 1; i< 8 ;i++) 25 printf("%3d", r[i]); 26 return 0; 27 }