目录
1、冒泡排序
2、选择排序
3、插入排序
4、希尔排序
5、归并排序
排序算法图解
1、冒泡排序
#include
#define comp(A,B) (A)>(B)
#define exch(A,B) {int c = A; A = B; B = c;}
int main(void)
{
int i, j;
int numb[10];
for (i = 0; i < 10; i++){
scanf_s("%d", &numb[i]);
}
for (i = 0; i < 10; i++){
for (j = i + 1; j < 10; j++){
if (comp(numb[j-1], numb[j]))
exch(numb[j], numb[j-1]);
}
}
for (i = 0; i < 10; i++){
printf("%d ", numb[i]);
}
}
2、选择排序
#include
#define comp(A,B) (A)>(B) //如果A>B则返回1,否则为0.
#define exch(A,B) {int c = A; A = B; B = c;}
int main(void)
{
int i, j, min;
int numb[10];
for (i = 0; i < 10; i++){
scanf_s("%d", &numb[i]);
}
for (i = 0; i < 9; i++){
min = i;
for (j = i + 1; j < 10; j++){
if (comp(numb[min], numb[j]))
min = j;
}
exch(numb[i], numb[min]);
}
for (i = 0; i < 10; i++){
printf("%d ", numb[i]);
}
}
3、插入排序
#include
#define comp(A,B) (A)>(B)
#define exch(A,B) {int c = A; A = B; B = c;}
int main(void)
{
int i, j, a;
int numb[10];
for (i = 0; i < 10; i++){
scanf_s("%d", &numb[i]);
}
for (i = 9; i > 0; i--){
if (comp(numb[i-1], numb[i]))
exch(numb[i-1], numb[i]);
}
for (i = 2; i < 10; i++){
j = i;
a = numb[i];
while (comp(numb[j - 1], a)){
numb[j] = numb[j - 1];
j--;
}
numb[j] = a;
}
for (i = 0; i < 10; i++){
printf("%d ", numb[i]);
}
}
4、希尔排序
#include#define comp(A,B) (A)>(B) //如果A>B则返回1,否则为0. #define exch(A,B) {int c = A; A = B; B = c;} int main(void) { int i, j, min; int numb[10]; for (i = 0; i < 10; i++){ scanf_s("%d", &numb[i]); } for (i = 0; i < 9; i++){ min = i; for (j = i + 1; j < 10; j++){ if (comp(numb[min], numb[j])) min = j; } exch(numb[i], numb[min]); } for (i = 0; i < 10; i++){ printf("%d ", numb[i]); } }
3、插入排序
#include
#define comp(A,B) (A)>(B)
#define exch(A,B) {int c = A; A = B; B = c;}
int main(void)
{
int i, j, a;
int numb[10];
for (i = 0; i < 10; i++){
scanf_s("%d", &numb[i]);
}
for (i = 9; i > 0; i--){
if (comp(numb[i-1], numb[i]))
exch(numb[i-1], numb[i]);
}
for (i = 2; i < 10; i++){
j = i;
a = numb[i];
while (comp(numb[j - 1], a)){
numb[j] = numb[j - 1];
j--;
}
numb[j] = a;
}
for (i = 0; i < 10; i++){
printf("%d ", numb[i]);
}
}
4、希尔排序
h的值是不可以随意确定的,如果h为1、2、4、8······就会出现有些位置重复判断,有些位置始终不能判断;就好像奇数得不到判断,偶数重复判断,会降低运行效率。
#include#define less(A,B) A < B #define exch(A,B) {int c = A; A = B; B = c;} int main() { int a[20]; int i, j, h; for (i = 0; i < 20; i++){ scanf_s("%d", &a[i]); } for (h = 0; h <= 20 / 3; h = 3 * h + 1);//h1=1; h2=4; h3=13; h4=40 for (h = h; h > 0; h = h / 3){ printf("%dn", h); for (i = h; i < 20; i++){ j = i; int v = a[i]; while (j >= h && less(v, a[j - h])){ a[j] = a[j - h]; j = j - h; } a[j] = v; } for (int i = 0; i < 20; i++){ printf("%-4d", a[i]); } printf("n"); } }
5、归并排序
本程序是将a数组作选择排序,b数组作插入排序。最后在归并到c数组中。
也可以将a作归并排序成一个有序数组,从1个1个开始归并,就有以2个为单位的部分有序,然后2个2个归并,4个4个归并·····直到等于a数组的个数。
#include#define less(A,B) (A) < (B) #define exch(A,B) {int c=A; A = B, B = c;} int main() { int a[5] = { 4,6,2,9,5 }; int b[10] = { 0,5,9,3,1,7,2,13,3,6 }; int c[15]; int i, j, k; for (i = 0; i < 5; i++){ int numb = i; for (j = i + 1; j < 5; j++) { if (less(a[j],a[numb])) numb = j; } exch(a[i], a[numb]); } printf("a: "); for (i = 0; i < 5; i++){ printf("%d ", a[i]); } printf("n"); for (i = 9; i > 0; i--){ if (less(b[i], b[i - 1])) exch(b[i], b[i - 1]); } for (i = 2; i < 10; i++){ j = i; int numb = b[i]; while (less(numb, b[j - 1])){ b[j] = b[j - 1]; j--; } b[j] = numb; } printf("b: "); for (i = 0; i < 10; i++){ printf("%d ", b[i]); } printf("n"); //两个数组已经有序,再将其排在c中 for (k = 0, i = 0, j = 0; k < 15; k++){ if (i == 5) { c[k] = b[j++]; continue; } if (j == 10) { c[k] == a[i++]; continue; } c[k] = less(a[i], b[j]) ? a[i++]: b[j++]; } printf("c: "); for (i = 0; i < 15; i++){ printf("%d ", c[i]); } }
不去打扰便是最好的守护!



