الگوریتم های مرتبسازی آن دسته از الگوریتم هایی هستند که برای مرتبسازی یک مجموعه از اعداد و یا حروف و یا اسامی(با توجه به اینکه هر حرف یک ارزش عددی دارد) استفاده میشود.در این مطلب الگوریتم مرتبسازی حبابی- که از سادهترین الگوریتم های مرتبسازی است- مورد بررسی قرار میگیرد.
الگوریتم مرتبسازی حبابی یک راه حل سر راست و واضح دارد.این الگوریتم یک مجموعه از اعداد را پیمایش میکند و هر بار عدد فعلی را با عدد بعدیاش مقایسه میکند و در صورتی که از آن بزرگتر باشد جای عدد فعلی با عدد بعدی عوض میشود.یا برعکس اگر بخواهیم مجموعه را به صورت نزولی مرتب کنیم. الگوریتم بارها و بارها مجموعه را مرتب میکند تا آنکه مجموعه مرتب شود.فهمیدن اینکه مجموعه مرتب شده است نیز به دو روش انجام میشود که بترتیب میتوانید بررسی کنید:
- در یک دور پیمایش جابجایی صورت نگیرد.یعنی در آن دور عددی پیدا نشود که از عدد بعدی خود بزرگتر(یا بصورت نزولی کوچکتر) باشد و جایش با عدد بعدی عوض نشود.
- روش دوم که روش من درآوردی است(خودم ساختمش!) این است که یک تابع جدا بنویسید که یکبار مجموعه را از اول تا آخر پیمایش کند و اگر عددی پیدا نشد که از عدد بعدیش بزرگتر باشد پس فهرستما مرتب است.
بیاید یک مجموعه سه عددی از اعداد را با این الگوریتم مرتب کنیم:
5 3 2
3 2 5
2 3 5
در مجموعه ی بالا در سه مرحله الگوریتم مرتب شد.اعدادی که در هر نوبت جایشان عوض شد پررنگ شده اند.
حال یک مجموعه چهار عضوی را مرتب میکنیم:
54 8 41 8
8 41 8 54
8 8 41 54
باز مجموعه در سه مرحله مرتب شد! اما این به این معنی نیست که همیشه در سه مرحله یک مجموعه مرتب میشود:
456 12 84 4 4 2
12 84 4 4 2 456
12 4 4 2 84 456
4 4 2 12 84 456
4 2 4 12 84 456
2 4 4 12 84 456
تصویر زیر میتواند به شما در درک سریع تر و بهتر این الگوریتم کمک کند(تصویر متحرک است)
و مرتب سازی حبابی در زبان های برنامه نویسی مختلف:
سی:
//Bubble Sort Algorithm#include <stdio.h>void swap(int *a,int *b){int temp = *a;*a = *b;*b = temp;}int issorted(int arr[]){for(int i = 0;i < 10;i++){if(!(arr[i] <= arr[i+1]))return 0;}return 1;}int main(){int arr[10];//filling the arrayfor (int i = 0;i < 10;i++){printf("\nEnter Element %i: ",i);scanf("%i",&arr[i]);}//showing the arrayfor (int i = 0;i < 10;i++){printf("Element #%i is #%i\n",i,arr[i]);}printf("Starting sorting...\n");//sorting the arraywhile(issorted(arr) == 0){//Until issorted returned 0 that means falsefor (int i = 0;i < 10;i++){if(arr[i] > arr[i+1])swap(&arr[i],&arr[i+1]);}}
در کد بالا تابع swap مقدار دو متغیر عدد صحیح را باهم جابجا میکند و تابع issorted نیز همانطور که از نامش پیداست چک میکند که آرایه مرتب شده است یا خیر.
سیشارپ:
//Bubble Sort in CSharp //Author: Farooq Karimi Zadeh using System; class Program{ static void Main(){ int[10] ary; for (int i = 0;i<10;i++){ Console.Write("Enter elemnt #"+i.ToString()+": "); ary[i] = (int)Console.ReadLine(); } ary = sort(ary); } static void swap(ref int a,ref int b){ int tmp = a; a = b; b = tmp; } static int[] sort(int[] ary){ bool change = true; while( change){ change = false; for (int i=0;i<10;i++){ if (i!=9){ if (ary[i]>ary[i+1]){ swap(ref ary[i],ary[i+1]); change = true; } } } } return ary; } static void print(int[] ary){ foreach (int i in ary){ Console.Write(i.ToString() + ","); } } }
سیپلاسپلاس(من تجربهی زیادی با این زبان ندارم پس شاید بخواهید کد بهتری روی اینترنت پیدا کنید):
#include<iostream> using namespace std; void swap(int *a,int *b); int[] sort(int arr[]); void print(int arr[]); int main(){ int arr[10]; for (int i=1;i<10;i++){ cout << "Enter element #" << i << ": " << endl; cin >> arr[i]; } print(arr); arr = sort(arr); cout << "Sorted: "; print(arr); } int[] sort(int arr[]) { bool swapped = true; int j = 0; int tmp; while (swapped) { swapped = false; j++; for (int i = 0; i < n - j; i++) { if (arr[i] > arr[i + 1]) { swap(&arr[i],&arr[i+1]); swapped = true; } } } return arr; } void print(int arr[]){ for(int i = 0;i<10;i++){ cout << arr[i] << ","; } cout << endl; } void swap(int *a,int *b){ int tmp = *a; *a = *b; *b = tmp; }
پایتون:
def bubbleSort(alist):
for passnum in range(len(alist)-1, 0, -1):
for i in range(passnum):
if alist[i] > alist[i+1]:
alist[i+1], alist[i] = alist[i], alist[i+1]
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
bubbleSort(alist)
print(alist)
یک نسخهی دیگر از این الگوریتم در پایتون(که من با حدود یک سال تجربه بیشتر نوشتمش):
def bubblesort(alist): swapped = True while swapped: swapped = False for i, v in enumerate(alist): if i == len(alist)-1: continue if v > alist[i+1]: alist[i], alist[i+1] = alist[i+1], alist[i] swapped = True return alist L = eval(input("Enter a List: ")) print(bubblesort(L))
و مرسی از سایت خوبتون