C語言的幾種常見排序方式
哈嘍,大家好,以下給大家列舉幾種C語言的常見排序方式,希望對大家有所幫助。
第一、氣泡排序(Bubble Sort)
排序原理:重複地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。
例子:
void
bubble_sort
(
int
array
[],
int
n
){
int
i
,
j
,
k
;
for
(
i
=
0
;
i
<
n
-
1
;
i
++
)
for
(
j
=
0
;
j
<
n
-
i
-
1
;
j
++
)
if
(
array
[
j
+
1
]
<
array
[
j
])
{
k
=
array
[
j
+
1
];
array
[
j
+
1
]
=
array
[
j
];
array
[
j
]
=
k
;
}
for
(
i
=
0
;
i
<
n
;
i
++
)
printf
(
“%2d”
,
array
[
i
]);
}
二、選擇排序(Selection sort)
工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
例子:
void
selection_sort
(
int
array
[],
int
n
)
{
int
i
,
j
,
t
;
for
(
i
=
0
;
i
<
n
-
1
;
i
++
)
for
(
j
=
1
+
i
;
j
<
n
-
1
;
j
++
)
if
(
array
[
i
]
>
array
[
j
])
{
t
=
array
[
j
];
array
[
j
]
=
array
[
i
];
array
[
i
]
=
t
;
}
for
(
i
=
0
;
i
<
n
;
i
++
)
printf
(
“%2d”
,
array
[
i
]);
}
三、插入排序(Insertion Sort)
工作原理:是透過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。
例子:
void
insert_sort
(
int
array
[],
int
n
)
{
int
i
,
j
,
temp
;
//此時的array[0]作為已排序位置
for
(
i
=
1
;
i
<
n
;
i
++
)
{
temp
=
array
[
i
];
j
=
i
-
1
;
while
(
j
>=
0
&&
array
[
j
]
>
temp
)
{
arr
[
j
+
1
]
=
array
[
j
];
j
——
;
}
array
[
j
+
1
]
=
temp
;
}
}
四、歸併排序(簡單)
工作原理:歸併排序要稍微複雜一點,歸併排序的實現分為 遞迴實現 與 迭代實現 。
遞迴實現的歸併排序是演算法設計中分治演算法(演算法後期再說)的典型應用,我們將一個大問題分割成小問題分別解決,然後用所有小問題的答案來解決整個大問題。
非遞迴(迭代)實現的歸併排序首先進行是兩兩歸併,然後四四歸併,然後是八八歸併成倍,一直類推直到歸併了整個陣列。
例子:
//模板(字元同)
#include
#define M 10
#define N 10
void
main
()
{
int
a
[
M
]
=
{
…
…
};
//一開始就有順序
int
b
[
N
]
=
{
…
…
};
//一開始就有順序
int
c
[
M
+
N
];
int
i
=
0
,
j
=
0
,
k
=
0
;
// i:a的下標,j:b的下標,k:c的下標
while
(
i
<
M
&&
j
<
N
)
//只要a,b均有未取元素
if
(
a
[
i
]
<
b
[
j
])
c
[
k
++
]
=
a
[
i
++
];
else
c
[
k
++
]
=
b
[
j
++
];
while
(
i
<
M
)
c
[
k
++
]
=
a
[
i
++
];
while
(
j
<
N
)
c
[
k
++
]
=
b
[
j
++
];
for
(
i
=
0
;
i
<
M
+
N
;
i
++
)
printf
(
“%2d”
,
c
[
i
]);
}
五、快速排序
工作原理:
在區間中隨機挑選一個元素作基準,將小於基準的元素放在基準之前,大於基準的元素放在基準之後,再分別對小數區與大數區進行排序。
#include
#define N 10
void
quick_sort
(
int
left
,
int
right
,
char
a
[])
{
int
i
,
j
,
t
,
temp
;
if
(
left
>
right
)
return
;
temp
=
a
[
left
];
i
=
left
;
j
=
right
;
while
(
i
!=
j
)
{
while
(
a
[
j
]
>=
temp
&&
i
<
j
)
j
——
;
while
(
a
[
i
]
<=
temp
&&
i
<
j
)
i
++
;
if
(
i
<
j
)
{
t
=
a
[
i
];
a
[
i
]
=
a
[
j
];
a
[
j
]
=
t
;
}
}
a
[
left
]
=
a
[
i
];
a
[
i
]
=
temp
;
quick_sort
(
left
,
i
-
1
);
quick_sort
(
i
+
1
,
right
);
}
void
main
()
{
int
i
;
int
a
[
N
];
printf
(
“請輸入%d個元素:”
,
N
);
for
(
i
=
0
;
i
<
N
;
i
++
)
scanf
(
“%d”
,
&
a
[
i
]);
quick_sort
(
0
,
N
-
1
,
a
);
for
(
i
=
0
;
i
<
N
;
i
++
)
printf
(
“%5d”
,
a
[
i
]);
}
總結:以上是五種排序方式的簡單說明,深入刨析有空再寫~