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


    冒泡排序

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

    //算法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	", 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<<"请输入待排序的数据:
    ";
    	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,以上就是双冒泡排序

    ♪(^∇^*)♪(^∇^*)(~ ̄▽ ̄)~有没有感觉很棒呀!!!(#^.^#),(*^▽^*)O(∩_∩)O哈哈~
  • 相关阅读:
    PTA 7-5 有趣的最近公共祖先问题 (30分)
    平衡二叉树的旋转类型及代码实现
    Ubuntu搭建青岛大学开源OJ
    见过猪跑现在开始吃猪肉了
    工作4年的老腊肉的总结
    服务器日志的目录
    Jacoco配置的问题
    一次述职之后的反省
    Python+Webdriver+Phantomjs,设置不同的User-Agent,获得的url不一致
    Eclipse+Pydev 找不到对应的module not in Pythonpath
  • 原文地址:https://www.cnblogs.com/ygjzs/p/12069680.html
Copyright © 2020-2023  润新知