大一剛放寒假期間,回想一下馬上進入大學時的心情,記得在暑假時加了乙個學校acm戰隊的群,當時感覺很美好,想開學的時候努力一下進入校隊的acm。可是自己又特別喜歡滲透,於是就把acm這個想法放下了,這幾天把sqllabs幹完了,出於閒想看看演算法。記得當時寫c課設的時候,氣泡排序也把我整一段時間才迷糊過來。好,廢話不多說,記錄一下自己的學習成果。
這些總結是根據菜鳥教程上的知識,加上自己的實驗和思考的成果。 十大經典排序演算法.在這裡我先說一下:下邊所有的演算法排序結果都從大到小
演算法思路:
這個演算法了解過的非常好理解,大致說下就是:比較相鄰資料,如果不符合規則(大的數在前或者小的數在前)就交換著兩個數的位置。但是如果資料是:6,5,7(要求是大的數在前)根據上述所說的,得到的結果:6,7,5。這顯然不符合要求,需要再經過一次迴圈才可得到正確的序列。因此氣泡排序的根本是:(如果要求序列是大的數在前)經過一次遍歷迴圈後最小的數交換到整個資料的末尾。依次類推第二個小的數就在整個資料的倒數第二位,最後最大的數就在第一位。排序成功。
#include void bubble_sort(int arr, int len) }}
}int main() ;
int len = (int) sizeof(arr) / sizeof(*arr);
bubble_sort(arr, len);
int i;
for (i = 0; i < len; i++)
return 0;
}
演算法思路:
假設第乙個資料最大,遍歷這個資料後邊的所有資料,發現後邊有資料大於這乙個資料,記錄較大的資料,繼續往後遍歷直到遍歷一遍所有資料,之後交換資料,此時第乙個資料即為整個資料的最大數。依次類推,假設第二個資料最大,遍歷這個資料後邊的所有資料,發現後邊有資料大於這乙個資料,記錄較大的資料,繼續往後遍歷直到遍歷一遍所有資料,之後交換資料。
#includeint main()
; int i=0,j=0,max;
int temp,len=7;
for(i = 0;ia[max]) //將假設的當前最大值與後面的值比較
}//當前最大值
if(max != i) //比較之後如果此次迴圈中最大值並非當前值
}for(int q=0 ; q<7; q++)
printf("%d ",a[q]);
}
演算法思路:(為了具有普遍性,在此假設前3個資料已經過插入排序成為正序)
取出第四個資料,此時第四個資料的位置空出,如果第三個資料小於第四個資料,將第三個資料換到第四個資料的位置,此時第三個資料位置空出,如果仍小於,則以此類推。如果不小於則將取出的這個資料放到第三個資料的位置。
#includeint main()
; int i,j,key,len=7;
for(i=1;i=0) && (arr[j]int main()
; int gap, i, j,len=7;
int temp;
for (gap = len >> 1; gap > 0; gap >>= 1)
arr[j + gap] = temp;
}} for(int q=0 ; q<7; q++)
printf("%d ",arr[q]);
}
#include#includeint min(int x, int y)
int main()
,len=7;
int *a = arr;
int *b = (int *) malloc(len * sizeof(int));
int seg, start;
for (seg = 1; seg < len; seg += seg)
int *temp = a;
a = b;
b = temp;
}if (a != arr)
free(b);
for(int q=0 ; q<7; q++)
printf("%d ",arr[q]);
}
十大經典排序演算法
十大經典排序演算法
#include #include #include void print_arr(int *arr, int n)
void counting_sort(int *ini_arr, int *sorted_arr, int n)
int main(int argc, char **ar**)
十大經典排序演算法
#include#define max 20
//#define showpass
#define base 10
void print(int *a, int n)
}void radixsort(int *a, int n)
} while (m / exp > 0) ;
for (i = 0; i < n; i++)
for (i = 1; i < base; i++)
for (i = n - 1; i >= 0; i--)
for (i = 0; i < n; i++)
exp *= base;
#ifdef showpass
printf("\npass : ");
print(a, n);
#endif
}}int main()
printf("\narray : ");
print(&arr[0], n);
radixsort(&arr[0], n);
printf("\nsorted : ");
print(&arr[0], n);
printf("\n");
return 0;
}
十大排序之選擇排序 排序演算法 C語言實現
選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是 第一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小 大 元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的資料元素的個數為零。選擇排序是不穩定...
十大排序之希爾排序 C語言實現 排序演算法
在這裡我們要提出逆序對的相關問題,設 a 為乙個有 n 個數字的有序集 n 1 其中所有數字各不相同。如果存在正整數 i,j 使得 1 i j n 而且 a i a j 則 這個有序對稱為 a 的乙個逆序對,也稱作逆序數。例如,陣列 3,1,4,5,2 的逆序對有 3,1 3,2 4,2 5,2 共...
十大排序之插入排序 排序演算法 C語言實現
插入排序,一般也被稱為直接插入排序。對於少量元素的排序,它是乙個有效的演算法 插入排序是一種最簡單的排序方法,它的基本思想是將乙個記錄插入到已經排好序的有序表中,從而乙個新的 記錄數增1的有序表。在其實現過程使用雙層迴圈,外層迴圈對除了第乙個元素之外的所有元素,內層迴圈對當前元素前面有序表進行待插入...