Menu Chính

ĐIỂM TIN CÁC BÁO

LIÊN KẾT WEBSITE

TIN TỨC

Ảnh ngẫu nhiên

Valentine11.swf Thieprong.swf Tinh_ca_CR.swf Bay_giua_ngan_ha.swf Daythonvyda.swf Mung_Giang_Sinh_20104.flv 201120101.swf USB.bmp Dtichhinhtron.swf Dtichelip.swf Goc_o_tam.swf Dtich_hinhquat.swf Dong_ho_dem_nguoc_15_giay.swf DirectedLine.swf Cylinder.swf Dtich_hchunhat.swf Dien_tich_xung_quanh_cua_hinh_tru_.swf Degenerate.swf EquilateralTriangle.swf EqUnitCircle.swf

VUI MỪNG CHÀO ĐÓN

1 khách và 0 thành viên

Thống kê

  • truy cập   (chi tiết)
    trong hôm nay
  • lượt xem
    trong hôm nay
  • thành viên
  • Hổ trợ Trực tuyến

    • (chithu1980)

    Menu chức năng 1

    Gốc > Góc Lập Trình Pascal > Thuật Toán >

    Sắp xếp nổi bọt

    Sắp xếp nổi bọt (bubble sort) là một thuật toán sắp xếp đơn giản, với thao tác cơ bản là so sánh hai phần tử kề nhau, nếu chúng chưa đứng đúng thứ tự thì đổi chỗ (swap). Có thể tiến hành từ trên xuống (bên trái sang) hoặc từ dưới lên (bên phải sang). Sắp xếp nổi bọt còn có tên là sắp xếp bằng so sánh trực tiếp. Nó sử dụng phép so sánh các phần tử nên là một giải thuật sắp xếp kiểu so sánh.

    Sắp xếp từ trên xuống

    Ví dụ:

    Quá trình sắp xếp nổi bọt của 5 phần tử

    Giả sử dãy cần sắp xếp có n phần tử. Khi tiến hành từ trên xuống, ta so sánh hai phần tử đầu, nếu phần tử đứng trước lớn hơn phần tử đứng sau thì đổi chỗ chúng cho nhau. Tiếp tục làm như vậy với cặp phần tử thứ hai và thứ ba và tiếp tục cho đến cuối tập hợp dữ liệu, nghĩa là so sánh (và đổi chố nếu cần) phần tử thứ n-1 với phần tử thứ n. Sau bước này phần tử cuối cùng chính là phần tử lớn nhất của dãy. Sau đó, quay lại so sánh (và đổi chố nếu cần) hai phần tử đầu cho đến khi gặp phần tử thứ n-2....

    Ghi chú: Nếu trong một lần duyệt, không phải đổi chỗ bất cứ cặp phần tử nào thì danh sách đã được sắp xếp xong.

    [sửa] Sắp xếp từ dưới lên

    Săp xếp từ dưới lên so sánh (và đổi chỗ nếu cần) bắt đầu từ việc so sánh cặp phần tử thứ n-1 và n. Tiếp theo là so sánh cặp phần tử thứ n-2 và n-1,... cho đến khi so sánh và đổi chỗ cặp phần tử thứ nhất và thứ hai. Sau bước này phần tử nhỏ nhất đã được nổi lên vi trí trên cùng (nó giống như hình ảnh của các "bọt" khí nhẹ hơn được nổi lên trên). Tiếp theo tiến hành với các phần tử từ thứ 2 đến thứ n.

    [sửa] Mã giả

    [sửa] Sắp xếp từ trên xuống

    procedure bubble_sort1(list L, number n)  //n=listsize
    For number i from n downto 2
    for number j from 1 to (i - 1)
    if L[j] > L[j + 1] //nếu chúng không đúng thứ tự
    swap(L[j], L[j + 1]) //đổi chỗ chúng cho nhau
    endif
    endfor
    endfor
    endprocedure

    Sắp xếp từ trên xuống

    procedure bubble_sort2(list L, number n)  //n=listsize
    For' number i from 1 ' n-1
    for number j from n-1 downto i
    if L[j] > L[j + 1] //nếu chúng không đúng thứ tự
    swap(L[j], L[j + 1]) //đổi chỗ chúng cho nhau
    endif
    endfor
    endfor
    endprocedure

    Giàm bớt vòng duyệt

    Nếu trong một lần duyệt nào đó với một i cố định khi vòng lặp j kết thúc mà không cần phải dổi chỗ cặp phần tử nào, nghiã là mọi cặp phân tử kề nhau đã đúng đúng thứ tự thì dãy đã được sắp xếp và không cần tiến hành vòng lặp tiếp theo. Do đó có thể dùng một cờ để kiểm soát việc này. Ta có một đoạn của thuật toán nổi bọt như sau:

    procedure bubble_sort3(list L, number n)
    i:= n
    while i > 1 do
    has_swapped := 0 //khởi tạo lại giá trị cờ
    for number j from 1 to (i - 1)
    if L[j] > L[j + 1] //nếu chúng không đúng thứ tự
    swap(L[j], L[j + 1]) //đổi chỗ chúng cho nhau
    has_swapped := 1 //có đổi chỗ ít nhất một lần, danh sách chưa sắp xếp xong
    endif
    endfor
    if has_swapped = 0 //nếu không có lần đổi chỗ nào, danh sách đã sắp xếp xong
    exit
    else //nếu có ít nhất một lần đổi chỗ, danh sách chưa sắp xếp xong
    i= i -1
    endif
    enddo
    endprocedure

    Ghi chú: Cũng có thể kông cần dùng đến biến i, khi đó mỗi lần kiểm tra đều phải duyệt từ đầu đến cuối dãy.

    Thời gian tính

    Với mỗi i = 1,2, ..,n-1 ta cần i phép so sánh. Do đó số nhiều nhất các lần so sánh và đổi chỗ trong giải thuật là

    (n-1)+(n-2)+...+ 2 + 1 = \frac {(n - 1)n} {2}

    Do đó độ phức tạp của giải thuật cỡ O(n2) .

     


    Nhắn tin cho tác giả
    Trần Chí Thu @ 09:28 16/05/2009
    Số lượt xem: 1956
    Số lượt thích: 0 người
     
    Gửi ý kiến

    Nhúng mã HTML