⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sort.c

📁 用各种方法进行排序
💻 C
字号:
#include <stdio.h>
#include "math.h"

void swap(int *a,int *b)
{
	int c = *a;
	*a = *b;
	*b = c;
}


//简单选择排序
void SelectSort(int r[],int n)
{
	int i,j,k,t;
	for (i=0;i<n-1;i++){
		j=i;//记下位置
		for (k=i+1;k<n;k++) if(r[j]>r[k]) j=k;//和余下的比较
		if (j>i){ t=r[j]; r[j]=r[i]; r[i]=t; }//交换
	}

}

//堆排序
void Sift(int r[], int n, int k)  //调整r[]中的结点k,使其成为堆
{
	int i,j,t;              //使其成为堆
	i=k; j=2*i+1; t=r[i];
	while (j<n){
		if (j<n-1&&r[j]<r[j+1]) j++;
		if (t<r[j]){ r[i]=r[j]; i=j; j=2*i+1; }
		else break;
	}
	r[i]=t;

}

void BSift(int r[],int n)
{
	int p=(n-2)/2,i;
	for (i=p;i>=0;i--)	Sift(r,n,i);

}

void HeapSort(int r[], int n)
{
	int i;
	BSift(r,n); //构造堆
	for (i=n-1;i>=0;i--){
		swap(&r[0],&r[i]); //最大的放在最后,升序排列
      Sift(r,i,0);  //调整其余的元素为堆
	}

}


//插入排序
void InsertSort(int r[], int n)
{
	int i,j,t;
	for (i=1;i<n;i++){
		t=r[i]; j=i-1;
		while (t<r[j]&&j>-1){ r[j+1]=r[j]; j--; 
		
		}
        //依次向后移动,找到插入位置
		r[j+1]=t;
	}

}


//希尔排序
void ShellSort(int r[], int n)
{
	int i,j,k,h;
	int t;
	int m, index;
	int H[50];


	m=(int)(log(n)/log(2));

	for(index=0;index<m+1;index++)
	{
		H[index]=(int)(pow(2,index));
	}

	//希尔排序的增量序列存放在H中, H[0] = 1

	for(k=m-1;k>-1;k--)
	{
		h=H[k];
		for(j=h;j<n;j++)
		{

			t=r[j];
			i=j-h;
			
			while(r[i]>t&&i>-1)
			{r[i+h]=r[i];
			i=i-h;
			}
			r[i+h]=t;
		}
	}
	

}


//冒泡排序
void Bsort(int r[], int n)
{
	int  j, k, f=n-1; //f初值为最后一个元素
   while(f>=0) { //表示上遍扫描发生过交换
     k=f-1;  f=-1;    //f~n-1已排好序
   for(j=0;j<=k;j++) {
	 if(r[j]>r[j+1])
    {swap(&r[j],&r[j+1]);f=j;}
   }
 }

}

//快速排序
void Qksort(int r[],  int  low,  int high)
{
	int x=r[low]; 
	int i=low; 
	int j=high;
	while (i<j){
		while (i<j&&r[j]>=x) j--;
		r[i] =r[j];
		while (i<j&&r[i]<=x) i++;
		r[j]=r[i];
	}
	r[j]=x;
	Qksort(r,low,i-1); 
	Qksort(r,i+1,high);
	

}


int main()
{
	int num[100];
	int n,i,sel;

	printf("输入数据长度:");
	scanf("%d",&n);
	printf("依次输入%d个数据:\n",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&num[i]);
	}

	printf("请选择排序方式:\n");
	printf(" ---- 选择排序:1\n");
	printf(" ---- 堆排序  :2\n");
	printf(" ---- 插入排序:3\n");
	printf(" ---- 希尔排序:4\n");
	printf(" ---- 冒泡排序:5\n");
	printf(" ---- 快速排序:6\n");
	scanf("%d",&sel);

	switch(sel)
    {
		case 1:SelectSort(num,n);break;
		case 2:HeapSort(num,n);break;
		case 3:InsertSort(num,n);break;
		case 4:ShellSort(num,n);break;
		case 5:Bsort(num,n);break;
		case 6:Qksort(num, 0,n-1);break;
	}

	
	printf("排序结果为:");
	for(i=0;i<n;++i)
	{
		printf("%d ",num[i]);
	}
	printf("\n");
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -