国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Java實現(xiàn)幾種常見排序方法(下)

2019-11-17 04:05:58
字體:
供稿:網(wǎng)友
插入排序的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。其具體步驟參見代碼及注釋。

view plaincopy to clipboardPRint?
/**  
* 插入排序<br/>  
* <ul>  
* <li>從第一個元素開始,該元素可以認(rèn)為已經(jīng)被排序</li>  
* <li>取出下一個元素,在已經(jīng)排序的元素序列中從后向前掃描</li>  
* <li>如果該元素(已排序)大于新元素,將該元素移到下一位置</li>  
* <li>重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置</li>  
* <li>將新元素插入到該位置中</li>  
* <li>重復(fù)步驟2</li>  
* </ul>  
*   
* @param numbers  
*/  
public static void insertSort(int[] numbers) {   
    int size = numbers.length, temp, j;   
    for(int i=1; i<size; i++) {   
        temp = numbers[i];   
        for(j = i; j > 0 && temp < numbers[j-1]; j--)   
            numbers[j] = numbers[j-1];   
        numbers[j] = temp;   
    }   
}  
/**
 * 插入排序<br/>
 * <ul>
 * <li>從第一個元素開始,該元素可以認(rèn)為已經(jīng)被排序</li>
 * <li>取出下一個元素,在已經(jīng)排序的元素序列中從后向前掃描</li>
 * <li>如果該元素(已排序)大于新元素,將該元素移到下一位置</li>
 * <li>重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置</li>
 * <li>將新元素插入到該位置中</li>
 * <li>重復(fù)步驟2</li>
 * </ul>
 *
 * @param numbers
 */
public static void insertSort(int[] numbers) {
int size = numbers.length, temp, j;
for(int i=1; i<size; i++) {
temp = numbers[i];
for(j = i; j > 0 && temp < numbers[j-1]; j--)
numbers[j] = numbers[j-1];
numbers[j] = temp;
}
}

歸并排序是建立在歸并操作上的一種有效的排序算法,歸并是指將兩個已經(jīng)排序的序列合并成一個序列的操作。參考代碼如下:

view plaincopy to clipboardprint?
/**  
* 歸并排序<br/>  
* <ul>  
* <li>申請空間,使其大小為兩個已經(jīng)排序序列之和,該空間用來存放合并后的序列</li>  
* <li>設(shè)定兩個指針,最初位置分別為兩個已經(jīng)排序序列的起始位置</li>  
* <li>比較兩個指針?biāo)赶虻脑兀x擇相對小的元素放入到合并空間,并移動指針到下一位置</li>  
* <li>重復(fù)步驟3直到某一指針達(dá)到序列尾</li>  
* <li>將另一序列剩下的所有元素直接復(fù)制到合并序列尾</li>  
* </ul>  
* 算法參考:<a href="http://www.cnitblog.com/intrl/" mce_href="http://www.cnitblog.com/intrl/">java部落</a>  
*   
* @param numbers  
*/  
public static void mergeSort(int[] numbers, int left, int right) {   
    int t = 1;// 每組元素個數(shù)   
    int size = right - left + 1;   
    while (t < size) {   
        int s = t;// 本次循環(huán)每組元素個數(shù)   
        t = 2 * s;   
        int i = left;   
        while (i + (t - 1) < size) {   
            merge(numbers, i, i + (s - 1), i + (t - 1));   
            i += t;   
        }   
        if (i + (s - 1) < right)   
            merge(numbers, i, i + (s - 1), right);   
    }   
}   
/**  
* 歸并算法實現(xiàn)  
*   
* @param data  
* @param p  
* @param q  
* @param r  
*/  
private static void merge(int[] data, int p, int q, int r) {   
    int[] B = new int[data.length];   
    int s = p;   
    int t = q + 1;   
    int k = p;   
    while (s <= q && t <= r) {   
        if (data[s] <= data[t]) {   
            B[k] = data[s];   
            s++;   
        } else {   
            B[k] = data[t];   
            t++;   
        }   
        k++;   
    }   
    if (s == q + 1)   
        B[k++] = data[t++];   
    else  
        B[k++] = data[s++];   
    for (int i = p; i <= r; i++)   
        data[i] = B[i];   
}  
/**
 * 歸并排序<br/>
 * <ul>
 * <li>申請空間,使其大小為兩個已經(jīng)排序序列之和,該空間用來存放合并后的序列</li>
 * <li>設(shè)定兩個指針,最初位置分別為兩個已經(jīng)排序序列的起始位置</li>
 * <li>比較兩個指針?biāo)赶虻脑兀x擇相對小的元素放入到合并空間,并移動指針到下一位置</li>
 * <li>重復(fù)步驟3直到某一指針達(dá)到序列尾</li>
 * <li>將另一序列剩下的所有元素直接復(fù)制到合并序列尾</li>
 * </ul>
 * 算法參考:<a href="http://www.cnitblog.com/intrl/" mce_href="http://www.cnitblog.com/intrl/">Java部落</a>
 *
 * @param numbers
 */
public static void mergeSort(int[] numbers, int left, int right) {
int t = 1;// 每組元素個數(shù)
int size = right - left + 1;
while (t < size) {
int s = t;// 本次循環(huán)每組元素個數(shù)
t = 2 * s;
int i = left;
while (i + (t - 1) < size) {
merge(numbers, i, i + (s - 1), i + (t - 1));
i += t;
}
if (i + (s - 1) < right)
merge(numbers, i, i + (s - 1), right);
}
}
/**
 * 歸并算法實現(xiàn)
 *
 * @param data
 * @param p
 * @param q
 * @param r
 */
private static void merge(int[] data, int p, int q, int r) {
int[] B = new int[data.length];
int s = p;
int t = q + 1;
int k = p;
while (s <= q && t <= r) {
if (data[s] <= data[t]) {
B[k] = data[s];
s++;
} else {
B[k] = data[t];
t++;
}
k++;
}
if (s == q + 1)
B[k++] = data[t++];
else
B[k++] = data[s++];
for (int i = p; i <= r; i++)
data[i] = B[i];
}

將之前介紹的所有排序算法整理成NumberSort類,代碼

view plaincopy to clipboardprint?
/**  
* BubbleSort.class  
*/  
package test.sort;   
import java.util.Random;   
/**  
* Java實現(xiàn)的排序類  
*   
* @author cyq  
*   
*/  
public class NumberSort {   
    /**  
     * 私有構(gòu)造方法,禁止實例化  
     */  
    private NumberSort() {   
        super();   
    }   
    /**  
     * 冒泡法排序<br/>  
     * <ul>  
     * <li>比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。</li>  
     * <li>對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。在這一點,最后的元素應(yīng)該會是最大的數(shù)。</li>  
     * <li>針對所有的元素重復(fù)以上的步驟,除了最后一個。</li>  
     * <li>持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。</li>  
     * </ul>  
     *   
     * @param numbers  
     *            需要排序的整型數(shù)組  
     */  
    public static void bubbleSort(int[] numbers) {   
        int temp; // 記錄臨時中間值   
        int size = numbers.length; // 數(shù)組大小   
        for (int i = 0; i < size - 1; i++) {   
            for (int j = i + 1; j < size; j++) {   
                if (numbers[i] < numbers[j]) { // 交換兩數(shù)的位置   
                    temp = numbers[i];   
                    numbers[i] = numbers[j];   
                    numbers[j] = temp;   
                }   
            }   
        }   
    }   
    /**  
     * 快速排序<br/>  
     * <ul>  
     * <li>從數(shù)列中挑出一個元素,稱為“基準(zhǔn)”</li>  
     * <li>重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個分割之后,  
     * 該基準(zhǔn)是它的最后位置。這個稱為分割(partition)操作。</li>  
     * <li>遞歸地把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。</li>  
     * </ul>  
     *   
     * @param numbers  
     * @param start  
     * @param end  
     */  
    public static void quickSort(int[] numbers, int start, int end) {   
        if (start < end) {   
            int base = numbers[start]; // 選定的基準(zhǔn)值(第一個數(shù)值作為基準(zhǔn)值)   
            int temp; // 記錄臨時中間值   
            int i = start, j = end;   
            do {   
                while ((numbers[i] < base) && (i < end))   
                    i++;   
                while ((numbers[j] > base) && (j > start))   
                    j--;   
                if (i <= j) {   
                    temp = numbers[i];   
                    numbers[i] = numbers[j];   
                    numbers[j] = temp;   
                    i++;   
                    j--;   
                }   
            } while (i <= j);   
            if (start < j)   
                quickSort(numbers, start, j);   
            if (end > i)   
                quickSort(numbers, i, end);   
        }   
    }   
    /**  
     * 選擇排序<br/>  
     * <ul>  
     * <li>在未排序序列中找到最小元素,存放到排序序列的起始位置</li>  
     * <li>再從剩余未排序元素中繼續(xù)尋找最小元素,然后放到排序序列末尾。</li>  
     * <li>以此類推,直到所有元素均排序完畢。</li>  
     * </ul>  
     *   
     * @param numbers  
     */  
    public static void selectSort(int[] numbers) {   
        int size = numbers.length, temp;   
        for (int i = 0; i < size; i++) {   
            int k = i;   
            for (int j = size - 1; j > i; j--) {   
                if (numbers[j] < numbers[k])   
                    k = j;   
            }   
            temp = numbers[i];   
            numbers[i] = numbers[k];   
            numbers[k] = temp;   
        }   
    }   
    /**  
     * 插入排序<br/>  
     * <ul>  
     * <li>從第一個元素開始,該元素可以認(rèn)為已經(jīng)被排序</li>  
     * <li>取出下一個元素,在已經(jīng)排序的元素序列中從后向前掃描</li>  
     * <li>如果該元素(已排序)大于新元素,將該元素移到下一位置</li>  
     * <li>重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置</li>  
     * <li>將新元素插入到該位置中</li>  
     * <li>重復(fù)步驟2</li>  
     * </ul>  
     *   
     * @param numbers  
     */  
    public static void insertSort(int[] numbers) {   
        int size = numbers.length, temp, j;   
        for (int i = 1; i < size; i++) {   
            temp = numbers[i];   
            for (j = i; j > 0 && temp < numbers[j - 1]; j--)   
                numbers[j] = numbers[j - 1];   
            numbers[j] = temp;   
        }   
    }   
    /**  
     * 歸并排序<br/>  
     * <ul>  
     * <li>申請空間,使其大小為兩個已經(jīng)排序序列之和,該空間用來存放合并后的序列</li>  
     * <li>設(shè)定兩個指針,最初位置分別為兩個已經(jīng)排序序列的起始位置</li>  
     * <li>比較兩個指針?biāo)赶虻脑兀x擇相對小的元素放入到合并空間,并移動指針到下一位置</li>  
     * <li>重復(fù)步驟3直到某一指針達(dá)到序列尾</li>  
     * <li>將另一序列剩下的所有元素直接復(fù)制到合并序列尾</li>  
     * </ul>  
     * 算法參考:<a href="http://www.cnitblog.com/intrl/" mce_href="http://www.cnitblog.com/intrl/">Java部落</a>  
     *   
     * @param numbers  
     */  
    public static void mergeSort(int[] numbers, int left, int right) {   
        int t = 1;// 每組元素個數(shù)   
        int size = right - left + 1;   
        while (t < size) {   
            int s = t;// 本次循環(huán)每組元素個數(shù)   
            t = 2 * s;   
            int i = left;   
            while (i + (t - 1) < size) {   
                merge(numbers, i, i + (s - 1), i + (t - 1));   
                i += t;   
            }   
            if (i + (s - 1) < right)   
                merge(numbers, i, i + (s - 1), right);   
        }   
    }   
    /**  
     * 歸并算法實現(xiàn)  
     *   
     * @param data  
     * @param p  
     * @param q  
     * @param r  
     */  
    private static void merge(int[] data, int p, int q, int r) {   
        int[] B = new int[data.length];   
        int s = p;   
        int t = q + 1;   
        int k = p;   
        while (s <= q && t <= r) {   
            if (data[s] <= data[t]) {   
                B[k] = data[s];   
                s++;   
            } else {   
                B[k] = data[t];   
                t++;   
            }   
            k++;   
        }   
        if (s == q + 1)   
            B[k++] = data[t++];   
        else  
            B[k++] = data[s++];   
        for (int i = p; i <= r; i++)   
            data[i] = B[i];   
    }   
  
}  
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 皋兰县| 宜宾市| 临沂市| 安康市| 台州市| 平乐县| 沙雅县| 亳州市| 长沙县| 榆中县| 石泉县| 弥勒县| 玛多县| 高雄县| 林口县| 宝坻区| 海淀区| 宕昌县| 兴山县| 伊宁县| 安义县| 平顺县| 确山县| 伽师县| 北碚区| 化隆| 台州市| 盐城市| 咸丰县| 绍兴市| 南安市| 清丰县| 娄底市| 三穗县| 桂林市| 云安县| 镇安县| 斗六市| 正镶白旗| 丁青县| 蓬溪县|