欢迎来到 跌倒的小黄瓜 的博客

♪(^∇^*)我要当大佬,(#^.^#)哈哈哈哈,(。-ω-)zzz我要成为优秀的人,(*^▽^*)٩(๑>◡<๑)۶O(∩_∩)O哈哈~~~~~~~~欢迎━(*`∀´*)ノ亻!

排序-双冒泡排序和冒泡排序(采用结构体)

冒泡排序

冒泡排序的基础上变为双冒泡排,可减少遍历次数序,从而实现优化
注释代码为错误代码,不用看,但反映了不同的思考方式

//算法8.4 冒泡排序
#include <iostream>
using namespace std;
#define  MAXSIZE  20          			//顺序表的最大长度
typedef struct
{
	int key;
	char *otherinfo;
}ElemType;
//顺序表的存储结构

typedef struct
{
    ElemType *r;	         						//存储空间的基地址
    int  length;            						//顺序表长度
}SqList;											//顺序表类型

void BubbleSort(SqList &L)
{
	//对顺序表L做冒泡排序
	int m,j,flag;
	ElemType t;
    m=L.length-1; flag=1; 				//flag用来标记某一趟排序是否发生交换
    while((m>0)&&(flag==1))
	{
		flag=0;           				//flag置为0,如果本趟排序没有发生交换,则不会执行下一趟排序
        for(j=0;j<m;j++)
			if(L.r[j].key>L.r[j+1].key)
			{
				flag=1;					//flag置为1,表示本趟排序发生了交换
				t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;	//交换前后两个记录
			}							//if
		--m;
    }									//while
}										//BubbleSort
// void dubBubbleSort(SqList &L){
//
// }
// void dubBubbleSort(SqList &L)
// {
// 	int left, right,  l, r, j, i = 0;
//  	ElemType t;
//     left =1;
//     right = L.length -1;
// 	 //必须要给l和r赋值,否则若数组一开始就有序,则right=r中的r未赋值,即报错
// 	 while(left < right){
// 		l = left + 1;
//         r = right -1; 
 
//         //第一次循环将最大的值放到末尾
//         for(j = left; j <= right; j++)
//         {
//             if(L.r[j].key > L.r[j + 1].key)
//             {
//                 t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;
//                 // r = j;
//             }
//         }
//         right = r;
 
//         //第二次循环将最小的值放到了开头
//         for(j = right; j >= left; j--)
//         {
//             if(L.r[j].key < L.r[j - 1].key)
//             {
//                 t=L.r[j];L.r[j]=L.r[j-1];L.r[j-1]=t;
//                 // l = j;
//             }
//         }
//         left = l;

// 		//  printf("第%d次排序结果:", i + 1);
//         // i++;
//         // for(j = 0; j < L.length; j++){
//         //     printf("%d\t", L.r[j].key);
// //        }
// 	 } 
// }

void dubBubbleSort(SqList &L){

	cout<<"排序过程:"<<endl;

	int m = L.length-1;
	ElemType t;
	int n=0;
	while(m>n){
	for (int i =  0; i < m; i++) {
				if (L.r[i].key > L.r[i+1].key) {
					t=L.r[i];L.r[i]=L.r[i+1];L.r[i+1]=t;
				}
			}
		m--;
	for (int i = m; i > n; i--) {
            if (L.r[i].key < L.r[i-1].key) {
                t=L.r[i];L.r[i]=L.r[i-1];L.r[i-1]=t;
            }
        }
		n++;

		for( int j=0;j < L.length ; j++){
			cout<<L.r[j].key;
		}
		cout<<endl;
	}
}
// int i, j, flag;
// 	int n=L.length-1;
// 	flag = 1;
// 	i = 1;
// 	while (flag != 0)
// 	{
// 		flag = 0;
// 		for (j = i; j < n-i; j++)
// 		{
// 			if (L.r[j].key > L.r[j + 1].key)
// 			{
// 				flag = 1;
// 				L.r[0].key = L.r[j].key;
// 				L.r[j].key = L.r[j + 1].key;
// 				L.r[j + 1].key = L.r[0].key;
// 			}
// 		}
// 		// i=1;
// 		for (j = n - i; j > i; j--)
// 		{
// 			if (L.r[j].key < L.r[j - 1].key)
// 			{
// 				flag = 1;
// 				L.r[0].key= L.r[j].key;
// 				L.r[j].key = L.r[j - 1].key;
// 				L.r[j - 1].key = L.r[0].key;
// 			}
// 		}
// 		i++;
// 	}


void Create_Sq(SqList &L)
{
	int i,n;
	cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
	cin>>n;											//输入个数
	cout<<"请输入待排序的数据:\n";
	while(n>MAXSIZE)
	{
		cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
		cin>>n;
	}
	for(i=0;i<n;i++)
	{
		cin>>L.r[i].key;
		L.length++;
	}

}

void show(SqList L)
{
	int i;
	for(i=0;i<L.length;i++)
		cout<<L.r[i].key<<"  ";
	cout<<endl;
}

int main()
{
	SqList L;
	L.r=new ElemType[MAXSIZE+1];
	L.length=0;
	Create_Sq(L);
	BubbleSort(L);
	cout<<"冒泡排序后的结果为:"<<endl;
	show(L);
   SqList L2;
	L2.length=0;
	L2.r=new ElemType[MAXSIZE+1];
	Create_Sq(L2);
	dubBubbleSort(L2);
    cout<<"双冒泡排序后的结果为:"<<endl;
	show(L2);
}


ok,以上就是双冒泡排序

posted @ 2019-12-19 19:28  跌倒的小黄瓜  阅读(699)  评论(0编辑  收藏  举报