排序

void Insert_Sort(RecType R[],int n)  
{    int i,j;
      for(i=2;i<=n; i++)  //表示待插入元素的下标
      {    R[0]=R[i]; //设置监视哨保存待插入元素,腾出R[i]空间
            j=i-1;      //j指示当前空位置的前一个元素
            while(R[0].key<R[j].key)//搜索插入位置并后移腾出空
          {    R[j+1]=R[j]; 
                j--; 
          }
          R[j+1]=R[0]; //插入元素
      }
	  	printf("直接插入排序:
");
	  for(int k=1;k<=n;k++)
	  printf("%d
",R[k]);
}
//希尔排序算法如下:
void ShellInsert ( RecType R[], int dk ,int n) 
{
for (int i=dk+1; i<=n; ++i )
if ( R[i].key< R[i-dk].key) 
{
        R[0] = R[i];            // 暂存在R[0]
        for(int j=i-dk;j>0&&(R[0].key<R[j].key);j-=dk)
            R[j+dk] =R[j];  // 记录后移,查找插入位置
R[j+dk] = R[0];                // 插入
} // if
printf("希尔排序:
");
for (int j=1; j<=n; ++j )
printf("%d
",R[j]);
} // ShellInsert
void ShellSort (RecType R[], int dlta[], int t)
{    // 增量为dlta[]的希尔排序	
for (int k=0; k<t; ++t)
ShellInsert(R, dlta[k],t);  //一趟增量为dlta[k]的插入排序
} // ShellSort
//冒泡排序算法如下:
void bubble_sort(int n,RecType a[])
{
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<n;j++){
			if(a[i].key>a[j].key){
			int temp=a[i].key;
			a[i].key=a[j].key;
			a[j].key=temp;
			}
		}
	}
	printf("冒泡排序:
");
for(int k=1;k<=n;k++)
printf("%d
",a[k]);
}
//快速排序算法如下:
int Partition (RecType R[], int low, int high) 
{
R[0] = R[low];  
int pivotkey = R[low].key;  // 枢轴  
while (low<high) 
{
while(low<high&& R[high].key>=pivotkey)
-- high;      // 从右向左搜索
R[low] = R[high];
while (low<high && R[low].key<=pivotkey) 
        ++ low;      // 从左向右搜索
R[high] = R[low];
}
R[low] = R[0];     return low;
}// Partition         
void QSort(RecType R[],  int s,  int  t ) 
{          // 对记录序列R[s..t]进行快速排序  
if (s < t) // 长度大于1
{             
int pivotloc = Partition(R, s, t); // 对 R[s..t] 进行一次划分
QSort(R, s, pivotloc-1);
QSort(R, pivotloc+1, t); 
}
printf("快速排序:
");
printf("|");
 for(int k=s;k<=t;k++)
	 printf("%d,",R[k]);
 printf("|");
 // QSort
}
//)简单选择排序的算法描述如下:
void SelectSort (RecType R[], int n ) // 对记录序列R[1..n]作简单选择排序。
{int i,j,k;
for (i=1; i<n; ++i) // 选择第 i 小的记录,并交换到位
{ 
for(k=i,j=i+1;j<=n;j++)
{
	if(R[j].key<R[k].key)
		k=j;
}
if(i!=k)
{
	R[0]=R[k];
	R[k]=R[i];
	R[i]=R[0];
}
}
printf("
");
printf("简单选择排序:
");
for(k=1;k<=n;k++)
printf("%d
",R[k]);
} // SelectSort
//堆排序算法描述如下:

void HeapAdjust(RecType R[], int s, int m)
{   
RecType rc = R[s];    // 暂存 R[s] 
for (int j=2*s; j<=m; j*=2 ) // j 初值指向左孩子
{ 
    if ( j<m && R[j].key<R[j+1].key )  
++j;     
if ( rc.key >= R[j].key )  
break; 
R[s] = R[j];   
s = j;    
}
R[s] = rc;  
} // HeapAdjust
void HeapSort( RecType R[] ,int n) // 对顺序表 H 进行堆排序
{  int i;
for ( i=n/2;   i>0;   --i )
     HeapAdjust ( R, i, n);    // 建大顶堆
for ( i=n; i>1; --i ) 
{
     R[0]=R[1];
	 R[1]=R[i];
	 R[i]=R[0];
     HeapAdjust(R, 1, i-1);  // 对 H.r[1] 进行筛选
}
printf("堆排序:
");
for(int k=1;k<=n;k++)
printf("%d
",R[k]);
} // HeapSort
//归并排序算法描述如下:
void Merge(RecType r1[],int low,int mid,int high,RecType r[])
{
	int i=low,j=mid+1,k=low;
	while((i<=mid)&&(j<=high))
	{
		if(r1[i].key<=r1[j].key)
		{
			r[k]=r1[i];
			++i;
		}
		else {
			r[k]=r1[j];
			++j;
		}
		++k;
	}
	while(i<=mid)
		r[k++]=r1[i++];
	while(j<=high)
		r[k++]=r1[j++];
}
void Msort ( RecType SR[],RecType TR1[], int s, int t ) 
{        // 将SR[s..t] 归并排序为 TR1[s..t]
if (s==t) 
TR1[s]=SR[s];
else 
{
int m = (s+t)/2;
    Msort (SR, TR1, s, m); // 递归地将SR[s..m]归并为有序的TR1[s..m]
Msort (SR, TR1, m+1, t);
    Merge (SR,s,m,t,TR1);
 }
 printf("
");
 printf("归并排序:
");
 printf("|");
 for(int k=s;k<=t;k++)
	 printf("%d,",TR1[k]);
 printf("|");
} // Msort

  






#include <stdio.h> typedef int KeyType ; typedef struct dateType { KeyType key ; } RecType; void Insert_sort(RecType R[],int n) { int i,j ; for(i=2;i<=n;i++) { R[0]=R[i] ; j=i-1 ; while(R[0].key < R[j].key) { R[j+1]=R[j] ; j-- ; } R[j+1]=R[0] ; } printf("直接插入排序: "); for(int k=1;k<=n ;k++) printf("%d ",R[k]); } void shellInsert (RecType R[],int dk,int n) { for(int i=dk+1 ; i<=n ; ++i) if(R[i].key < R[i-dk].key) { R[0]=R[i] ; for(int j=i-dk; j>0&& (R[0].key < R[j].key) ;j-=dk) R[j+dk]=R[j]; R[j+dk]=R[0]; } printf("希尔排序: "); for(int j=1;j<=n;++j) printf("%d ",R[j]); } void shellsort(RecType R[],int dlta,int t) { for(int k=0; k<t; ++t) shellInsert (R,dlta[k] ,t); } void bubble_sort(int n,RecType a[]) { for(int i=1;i<=n;i++) { for(int j=i+1 ; j<n;j++) { if(a[i].key < a[j].key) { int temp=a[i].key ; a[i].key = a[j].key ; a[j].key = temp ; } } } printf("冒泡排序: "); for(int k=1;k<=n ; k++) printf("%d ",a[k]); } int partition(RecType R[],int low,int high) { R[0]=R[low] ; int pivotkey=R[low].key ; while(low<high) { while(low<high && R[high].key>=pivotkey) --high; R[low] =R[high] while(low<high && R[low].key<=pivotkey) ++low ; R[high]=R[low] ; } R[low] =R[0]; return low; } void qsort(RecType R[],int s,int t) { if(s<t) { int pivotloc= partition(R,s,t); qsort(R,s,pivotloc-1); qsort(R,pivotloc+1,t); } printf("快速排序: "); printf("|"); } void selectsort(RecType R[],int n) { int i,j,k ; for(i=1;i<n;++i) { for(k=i,j=i+1;j<=n ;j++) { if(R[j].key < R[k].key) k=j ; } if(i!=k) { R[0]=R[k]; R[k]=R[i]; R[i]=R[0]; } } printf(" "); printf("简单选择排序: "); for(int k=1;k<=n ; k++) printf("%d ",R[k]); } void heapadjust(RecType R[],int s,int m) { RecType rc=R[s] ; for(int j=2*s; j<=m; j*=2) { if(j<m && R[j].key < R[j+1].key) ++j ; if(rc.key>=R[j].key) break ; R[s]=R[j]; s=j ; } R[s]=rc ; } void heapsort(RecType R[],int n) { int i ; for(i=n/2; i>0 ; --i) heapadjust(R,i,n); for(i=n; i>1; --i) { R[0]=R[1] ; R[1]=R[i] ; R[i]=R[0] ; heapadjust(R,1,i-1); } printf("堆排序: "); for(int k=1;k<=n ; k++) printf("%d ",R[k]); } void merge(RecType r1[],int low,int mid,,int high,RecType r[]) { int i=low,j=mid+1,k=low ; while((i<=mid)&& (j<=high)) { if(r1[i].key<=r1[j].key) { r[k]=r1[i]; ++i; } else { r[k]=r1[j]; ++j; } ++k; } while(i<=mid) r[k++]=r1[i++]; while(j<=high) r[k++]=r1[j++]; } void msort(RecType SR[],RecType TR1[],int s,int t) { if(s==t) TR1[s]=SR[s]; else { int m=(s+t)/2; msort(SR,TR1,s,m); msort(SR,TR1,m+1,t); merge(SR,s,m,t,TR1); } printf(" "); printf("归并排序: "); printf("|"); for(int k=s;k<=t ; k++) printf("%d ",TR1[k]); printf("|"); } void main() { RecType R[20],R1[20]; int n,s,t,dk ; printf("请输入n ") ; scanf("%d",&n); printf("请输入n个数: ") ; for(int k=1;k<=n;k++) scanf("%d",&R[k]); Insert_sort(R,n) ; printf("请输入dk ") ; scanf("%d",&dk); shellInsert(R,dk,n); bubble_sort (n,R) ; printf("请输入s,t ") ; scanf("%d%d",&s,&t); qsort(R,s,t) ; selectsort(R,n); heapsort(R,n); msort(R,R1,s,t); }

  

原文地址:https://www.cnblogs.com/wc1903036673/p/3443850.html