資料結構-——排序
#include <stdlib.h>
#include <stdio.h>
#define MAX 50
int slist[MAX]; /*待排序序列*/
void insertSort(int list[], int n);
void createList(int list[], int *n);
void printList(int list[], int n);
void heapAdjust(int list[], int u, int v);
void heapSort(int list[], int n);
/*直接插入排序*/
void insertSort(int list[], int n)
{
int i = 1, j = 0, node = 0, count = 1;
printf("對序列進行直接插入排序:\n");
printf("初始序列為:");
printList(list, n);
for(i = 2; i <= n; i++)
{
node = list[i];
j = i - 1;
while(j >= 0 && node < list[j])
{
list[j+1] = list[j];
--j;
}
list[j+1] = node;
printf("第%d次排序結果:", count++);
printList(list, n);
}
}
/*堆排序*/
void heapAdjust(int list[], int u, int v)
{
int i = u, j , temp = list[i];
j = 2 * i;
while (j <= v)
{
if(j < v && list[j] < list[j+1])
j++; /*若右孩子較大,則把j修改為右孩子的下標*/
if(temp < list[j])
{
list[i] = list[j]; /*將list[j]調到父親的位置上*/
i = j;
j = 2 * i; /*修改i和j的值,以便繼續向下篩選*/
}
else
break; /*篩選完成,終止迴圈*/
}
list[i] = temp; /*被篩結點的值放入最終位置*/
}
void heapSort(int list[], int n)
{
int i = 0, temp = 0, count = 1;
printf("對序列進行堆排序:\n");
printf("初始序列為:");
printList(list, n);
for (i = n / 2; i > 0; i--)
heapAdjust(list, i, n); /*建立初始堆*/
printf("建立的初始堆為:");
printList(list, n);
for(i = n ; i > 1; i--)
{/*迴圈,完成堆排序*/
temp = list[1];
list[1] = list[i];
list[i] = temp; /*將第一個元素同當前區間內最後一個元素對換*/
heapAdjust(list, 1 , i-1); /*篩選出list[1]結點*/
printf("第%d次排序結果:", count++);
printList(list, n);
}
}
/*生成待排序序列*/
void createList(int list[], int *n)
{
int i = 1,a;
printf("請輸入待排序序列(長度小於50,以輸入一個字元結束):\n");
while(scanf("%d",&a)==1)
{
list[i] = a;
i++;
}
*n=i-1;
getchar();
}
/*輸出排序結果*/
void printList(int list[], int n)
{
int i = 1;
for(; i <= n; i++)
{
printf(" %d ", list[i]);
if(i % 10 ==0 && i != 0)
printf("\n");
}
printf("\n");
}
int main()
{
int choice=1,length;
while(choice!=0)
{
printf("\n");
printf("***** 內部排序演算法演示程式 *****\n");
printf("\n1. 直接插入排序 \n");
printf("\n2. 堆排序 \n");
printf("\n0. 退出\n");
printf("\n請選擇:");
scanf("%d", &choice);
getchar();
switch(choice)
{
case 1:
{
createList(slist, &length);
insertSort(slist, length);
break;
}
case 2:
{
createList(slist, &length);
heapSort(slist, length);
break;
}
default:choice=0;
}
printf("\n");
}
return 0;
}
輸入待排序序列:49 38 65 97 13 27 49(以輸入一個字元作為結束)
1) 直接插入排序執行結果(寫出每一趟的狀態):
2)
2)堆排序執行結果(寫出每一趟的狀態):
2、在1題中補充希爾排序演算法。
演算法程式碼:
void XierSort(int list[], int n)
{
int i,j, node=0, count=1;
int m;
printf("對序列進行希爾排序:\n");
printf("初始序列為:");
printList(list, n);
for(m=n/2; m>0; m/=2)
{
for(i=m+1; i<=n;i++)
{
node = list[i];
j=i-m;
while(j>=1&&node<list[j])
{
list[j+m] = list[j];
j=j-m;
}
list[j+m] = node;
printf("第%d次排序結果:", count++);
printList(list, n);
}
}
}
輸入待排序序列:49 38 65 97 13 27 49(以輸入一個字元作為結束)
執行結果(寫出每一趟的狀態):
3、在1題中補充快速排序演算法。
演算法程式碼:
int Partition(int list[],int low,int high)
{
//int low1=low,high1=high;
int key=list[low];
while(low<high)
{
while(low<high && list[high]>=key)
--high;
list[low]=list[high];
while(low<high && list[low]<=key)
++low;
list[high]=list[low];
}
list[low]=key;
return low;
}
void Quicksort(int list[],int low,int high,int n)
{
int h,i;
if(low<high)
{
h=Partition(list,low,high);
printList(list, n);
Quicksort(list,h+1,high,n);
Quicksort(list,low,h-1,n);
}
}
輸入待排序序列:49 38 65 97 13 27 49(以輸入一個字元作為結束)
執行結果(寫出每一趟的狀態):