簡體   English   中英

C基本排序算法

[英]C Basic Sort Algorithm

我不太了解使用嵌套For循環的基本排序算法的過程:

for(i=0; i<MAX; i++){
        for(j=i; j<MAX; j++){
            if(data[i] > data[j]){
                tmp = data[i];
                data[i] = data[j];
                data[j] = tmp;
            }
        }
    }

如果j=i那不是就循環並比較相同的數字,因為i和j在循環中都從0開始?

我已經嘗試使用Google搜索來對此特定代碼進行解釋,但找不到任何有用的信息。

完整程序:

#include <stdio.h>
#include <stdlib.h>

#define MAX 10

int main()
{
    int data[MAX];
    int i, j, tmp;

    for(i=0;i<MAX;i++){
        printf("Enter number %d: ", i);
        scanf("%d", &data[i]);
    }

    for(i=0; i<MAX; i++){
        for(j=i; j<MAX; j++){
            if(data[i] > data[j]){
                tmp = data[i];
                data[i] = data[j];
                data[j] = tmp;
            }
        }
    }

    printf("\nSorted List:\n");
    for(i=0;i<MAX;i++){
        printf("Item %d: %d\n", i, data[i]);
    }
}

該算法是一種虛擬化的選擇排序 -它與Wikipedia上的選擇排序描述相符:

該算法將輸入列表分為兩部分:已排序項目的子列表,該列表從左到右在列表的前部(左側)建立;剩下的要排序項目的子列表,它們占據了列表的其余部分。清單。 最初,已排序的子列表為空,未排序的子列表為整個輸入列表。 該算法通過在未排序的子列表中找到最小(或最大,取決於排序順序)元素,將其與最左邊的未排序元素交換(交換)(按排序順序排列),然后將子列表邊界向右移動一個元素。

但實際上不是偽算法,因為它會進行一些不必要的交換。

在第一個內部回合中,當i等於j ,比較data[i] > data[j]將為false,並且將不執行交換。

然后, j將遞增,現在它正在將i th值與i + 1 th值進行比較。

為了避免徒勞的比較,請使用i + 1初始化j

for (i = 0; i < MAX; i++) {
    for (j = i + 1; j < MAX; j++) {
        if (data[i] > data[j]) {
            tmp = data[i];
            data[i] = data[j];
            data[j] = tmp;
        }
    }
}

它與普通選擇排序的不同之處在於,它使從第i個位置來回不必要的交換。 普通選擇排序查找最小索引,並且對每個元素僅進行一次交換:

for (i = 0; i < MAX; i++) {
    int min = i;
    for (j = i + 1; j < MAX; j++) {
        if (data[min] > data[j]) {
            min = j;
        }
    }

    tmp = data[min];
    data[min] = data[i];
    data[i] = tmp;
}

但是,原始匹配選擇排序的描述(並且運行時間是相同的,盡管常量由於不必要的交換而變得更糟),因為:

該算法通過在未排序子列表中找到最小(或最大,取決於排序順序)元素,將其與最左邊未排序元素交換(交換)(以排序順序排列)來進行

算法在未排序的子列表中找到最小的元素時,將其實現,當當前最小的項目通過列表時,將其與最左邊的未排序的項目交換


C標准庫已經包含qsort ,可以使用它代替重新發明輪子-我們只需要編寫比較函數即可:

#include <stdlib.h>

int compare_ints(const void *a, const void *b) 
{
    return (*(const int*)a - *(const int*)b);
}

int main(void) {
    ...
    qsort(data, MAX, sizeof(int), compare_ints);
    ...
}

不,它不會循環,因為您只需將data[i]data[i]交換兩次,盡管最好像這樣重寫這段代碼:

for(i=0; i<MAX-1; i++){
    for(j=i+1; j<MAX; j++){
        if(data[i] > data[j]){
            tmp = data[i];
            data[i] = data[j];
            data[j] = tmp;
        }
    }
}

但是這兩個代碼是相同的。

該代碼使用的算法是冒泡排序 如果您想更好地了解它的功能,請參閱Wikipedia文章。

這是冒泡排序 其要點是它會交換發現的兩個相鄰值不按順序排列,直到所有值都按順序排列為止。

編碼

for(i=0; i<MAX; i++){
        for(j=i; j<MAX; j++){
            if(data[i] > data[j]){
                tmp = data[i];
                data[i] = data[j];
                data[j] = tmp;
            }
        }
    }

顯然將無法正常運行。 基本上,它需要比較數組的每個元素並對其進行排序。 基本上是時間復雜度為O(n ^ 2)的冒泡排序。

而不是j = i

應該是j = i + 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM