直接插入、折半插入、冒泡、快速、簡單選擇等排序方法

//簡單選擇排序
#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;
		}
		
	}

}


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