算法学习Day3排序

排序算法-冒泡排序:

冒泡思想:

比较两个相邻的元素,将值大的元素交换至右端。

思路:
依次比较相邻的两个数,将小数放在前面,大数放在后面。
即在第一趟:
首先比较第1个和第2个数,将小数放前,大数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,
如此继续,直至比较最后两个数,将小数放前,大数放后。
重复第一趟步骤,直至全部排序完成。

核心代码:
//外层循环控制排序的次数
        for (int i = 0; i < arr.length; i++) {
            //内层循环控制每一趟排序次数
            for (int j = 0; j <arr.length-1-i; j++) {
                if (arr[j]>arr[j+1]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }

for (int i = 0; i < arr.length; i++)
控制外层循环控制排序的次数,在每一次排序后,最大的数都会在最右边,所以相当于依次从右边往左边递进。
for (int j = 0; j

 if (arr[j]>arr[j+1]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }

temp是一个临时存元素的变量。

冒泡复杂度分析:

冒泡排序的优点:
每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。

相比于其他排序来说:冒泡可以检测输入序列是否是已经排序的。

用时间复杂度来说:
 
在上述代码中,时间复杂度为O(n2)

改进:
可以通过增加一个附加的标记改进算法,在排序的过程中,没有交换操作表示排序完成。如果序列是有序的,可以通过判断该标记点来结束算法。

 void ButtbleSort(int a[],int n){
        int pass, i ,temp,swapped=1;
        for(pass=n-1;pass>0&&swapped;pass--){
            swapped=0;
            for (i = 0; i <pass; i++) {
                if (a[i]>a[i+1]){
                    temp=a[i];
                    a[i]=a[i+1];
                    a[i+1]=temp;
                    swapped=1;
                }
            }
        }
    }

swapped标记元素,用来查看是否排序。

全部代码(JAVA):

import java.util.Scanner;
public class 冒泡排序{
    冒泡排序(){
        Scanner scanner=new Scanner(System.in);
        System.out.println("输入个数:");
        int max=scanner.nextInt();
        int arr[]=new int[max];
        System.out.println("依次输入待排序得数:");
        for (int i = 0; i < arr.length; i++) {
            arr[i]= Integer.parseInt(scanner.next());
        }
        System.out.println("排序前:");
        for (int num : arr){
            System.out.print(num+" ");
        }
        //外层循环控制排序的次数
        for (int i = 0; i < arr.length; i++) {
            //内层循环控制每一趟排序次数
            for (int j = 0; j <arr.length-1-i; j++) {
                if (arr[j]>arr[j+1]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        System.out.println();
        System.out.println("排序后:");
        for (int num : arr){
            System.out.print(num+" ");
        }
    }
    public static void main(String[] args) {
        冒泡排序 n=new 冒泡排序();
    }

}

Python代码:

list=[]
while True:
    print('排几个数')
    try:
        num=int(input())
        for i in range(num):
            a=int(input("请输入第"+str((i+1))+'个数'))
            list.append(a)
    except ValueError:
        print('error')
    print(list)

    for j in range(len(list)-1):
        for k in range(len(list)-1):
            if list[k]>list[k+1]:
                t=list[k]
                list[k]=list[k+1]
                list[k+1]=t

    # print(sorted(list,reverse=True))


    print(list)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值