c语言实现 堆排序和插入排序
1.堆排序
#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:\t", p);
for(i = 1; i< 7 ;i++)
{
printf("%3d",r[i]);
}
printf("\n----------------------------------\n");
}
/*堆排序算法*/
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("\n heap sort after:\n");
HeapSort(r, 6);
system("color 4E");
system("pause");
return 0;
}
2.插入排序
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("\n排序后的元素是:"); 23 InsertSort(r, 7); 24 for(i = 1; i< 8 ;i++) 25 printf("%3d", r[i]); 26 return 0; 27 }
不停的思考,就会不停的进步

浙公网安备 33010602011771号