排序總結---冒泡排序

//
// Created by liyuanshuo on 2017/3/17.
//

#include "bubble_sort.h"

/*
 *基本思想:
 *
 * 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較
 * 大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換
 *
 */

void bubble_sort_1( int a[], int n )
{
	for (int i = 0; i < n-1; ++i)
	{
		for (int j = 0; j < n-i-1; ++j)
		{
			if( a[j] > a[j+1] )
			{
				int tmp = a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
			}
		}
	}
}

/*
 *冒泡排序算法的改進:
 *
 * 對冒泡排序常見的改進方法是加入一標誌性變量exchange,用於標誌某一趟排序過程中是否有數據交換,如果進行
 * 某一趟排序時並沒有進行數據交換,則說明數據已經按要求排列好,可立即結束排序,避免不必要的比較過程。本
 * 代碼再提供以下兩種改進算法:
 *
 */

//
//1.設置一標誌性變量pos,用於記錄每趟排序中最後一次進行交換的位置。由於pos位置之後的記錄均已交換到位,故
//在進行下一趟排序時只要掃描到pos位置即可。
//

void bubble_sort_2( int r[], int n )
{
	int i = n - 1;
	while ( i > 0 )
	{
		int pos = 0;
		for (int j = 0; j < i; ++j)
		{
			if( r[j] > r[j+1] )
			{
				pos = j;
				int tmp = r[j];
				r[j] = r[j + 1];
				r[j + 1] = tmp;
			}
		}
		i = pos;
	}
}

//2.傳統冒泡排序中每一趟排序操作只能找到一個最大值或最小值,我們考慮利用在每趟排序中進行正向和反向兩遍
//冒泡的方法一次可以得到兩個最終值(最大者和最小者) , 從而使排序趟數幾乎減少了一半。

void bubble_sort_3( int r[], int n)
{
	int loww = 0;
	int highh = n - 1;
	int tmp, j;
	while ( loww < highh )
	{
		for ( j=loww ; j<highh ; j++ )
		{
			if( r[j] > r [j+1] )
			{
				tmp = r[j];
				r[j] = r[j+1];
				r[j+1] = tmp;
			}
		}
		--highh;
		for ( j = highh ; j > loww ; --j )
		{
			if( r[j] < r[j-1] )
			{
				tmp = r[j];
				r[j] = r[j-1];
				r[j-1] = tmp;
			}
		}
		++loww;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章