直接插入、折半插入、冒泡、快速、简单选择等排序方法

//简单选择排序
#include <stdio.h>
#include <string.h>  //头文件  将数组进行复制
#include <stdlib.h>   

void Simplechoices(int a[])
{
	int i;
	int j;
	int t;
	for(i=1;i<=9;i++)
        for (j=i+1;j<=10;j++)
            if(a[i]>a[j])    //如果前一个数比后一个数大,则利用中间变量t实现两值互换
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
    printf("排序后的顺序是:\n");
    for(i=1;i<=10;i++)
        printf("%5d", a[i]);    //输出排序后的数组
    printf("\n");
}

void fast(int s[],int start,int end)    
{
    int i,j;    //定义变量为基本整型
    i=start;    //将每组首个元素赋给i
    j = end;    //将每组末尾元素赋给j
    s[0]=s[start];    //设置基准值
    while(i<j)
    {
        while(i<j&&s[0]<s[j])     
			j--;    //位置左移
		if(i<j)
		{
            s[i]=s[j];    //将s[j]放到s[i]的位置上
            i++;    //位置右移
        }
        while(i<j&&s[i]<=s[0])
            i++;    //位置左移
        if(i<j)
        {
            s[j]=s[i];    //将大于基准值的s[j]放到s[i]位置
            j--;    //位置左移
        }
    }
    s[i]=s[0];    //将基准值放入指定位置
    if (start<i)
        fast(s,start,j-1);    //对分割出的部分递归调用qusort()函数
    if (i<end)
        fast(s,j+1,end);


	
}

void bubbling(int a[])
{
	int i;
	int j;
	int t;
	for(i=1;i<10;i++)    //变量i代表比较的趟数
        for(j=1;j<11-i;j++)    //变最j代表每趟两两比较的次数
            if(a[j]>a[j+1])
            {
                t=a[j];    //产利用中间变童实现两值互换
                a[j]=a[j+1];
                a[j+1]=t;
            }
            printf("排序后的顺序是:\n");
            for(i=1;i<=10;i++)
                printf("%5d",a[i]);    //将胃泡排序后的顺序输出
        printf("\n");

}


void BInsertSort(int a[],int size){
    int i,j,low = 0,high = 0,mid;      //设置mid  low high方便进行找到并插入
    int temp = 0;                        
    for (i=1; i<size; i++) {           //进行排序的趟数   为size-1
        low=1;                         //总是将low设置为0
        high=i;                      
        temp=a[i+1];                     //temp为将要插入的数字
        //采用折半查找法判断插入位置,最终变量 low 表示插入位置
        while (low<=high) {           //当low和high开始错位的时候,就退出循环
            mid=(low+high)/2;         
            if (a[mid]>temp) {
                high=mid-1;
            }else{
                low=mid+1;
            }
        }

        //有序表中插入位置后的元素统一后移
        for (j=i+1; j>low; j--) {
            a[j]=a[j-1];
        }
        a[low]=temp;//插入元素
    }

	for(int q = 1; q<11;q++)
	{
		printf("%d ",a[q]);
	}
   
}

void Directinsort(int s[], int n)    
{
    int i,j;
    for(i=2;i<=n;i++)         //数组下标从2开始,一直到最后一个元素结束,s[0]做监视哨,s[1]一个数据无可比性
    {
        s[0]=s[i];            //给监视哨陚值
        j=i-1;                //确定好该元素最多和哪一位元素进行比较
        while(s[0]<s[j])      //当出现待插入元素比最后最后一位元素小的时候,将该元素向后移动
        {
            s[j+1]=s[j];     //数据右移
            j--;              //产移向左边一个未比较的数
        }
        s[j+1]=s[0];          //在确定的位置插入s[i]
    }

	for(int t=1;t<11;t++)
        printf("%d  ",s[t]); //将排序后的数组输出

}

void simple(int a[])
{
	int i;
	int j;
	int t;
	for(i=1;i<=9;i++)
        for (j=i+1;j<=10;j++)
            if(a[i]>a[j])    //如果前一个数比后一个数大,则利用中间变量t实现两值互换
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
    printf("排序后的顺序是:\n");
    for(i=1;i<=10;i++)
        printf("%5d", a[i]);    //输出排序后的数组
    printf("\n");
}
void menu()
{
	printf("\n1、直接插入排序\n");
	printf("2、折半插入排序\n");
	printf("3、冒泡排序\n");
	printf("4、快速排序\n");
	printf("5、简单选择排序\n");
	printf("6、显示数组\n");
	printf("0、退出程序\n");
}



void main()
{
	int x;
    int i,a[11];    //定义变量及数组为基本整型
    printf("请输入10个数:\n");
    for(i=1;i<11;i++)
        scanf("%d",&a[i]);    //从键盘中输入要排序的10个数字
	
	while(1){
		menu();
		printf("请输入您要的选择\n");
		scanf("%d",&x);
		switch(x)
		{
		case 0:
			exit(0);

		case 1:
			system("cls");
			int b[11];
			memcpy(b,a,sizeof(int)*11);
			Directinsort(b,10);
			break;

		case 2:
			system("cls");
			int c[11];
			memcpy(c,a,sizeof(int)*11);
			BInsertSort(c,10);
			break;

		case 3:
			system("cls");
			int d[11];
			memcpy(d,a,sizeof(int)*11);
			bubbling(d);
			break;

		case 4:
			system("cls");
			int e[11];
			memcpy(e,a,sizeof(int)*11);
			fast(e,1,10); 
			for(int y = 1;y<11;y++)
			{
				printf("%d ",e[y]);
			}
			break;


		case 5:
			system("cls");
			int f[11];
			memcpy(f,a,sizeof(int)*11);
			Simplechoices(f);
			break;

		case 6:
			{
				system("cls");
				for(int o = 1;o<11; o++)
				{
					printf("%d  ",a[o]);
				}
				break;
			}

		default:
			system("cls");
			printf("您的输入有误,请重新输入\n");
			break;
		}
		
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章