数据结构——交换排序(冒泡、快排)

Posted by Beyonderwei on 2019-04-17
Words 531 and Reading Time 2 Minutes
Viewed Times

一、冒泡排序

排序思想

    从头到尾,两两比较相邻的两个元素,如果顺序不对,则交换顺序,这样每一次即可将参与比较中最小的找出来。

图解

    从下向上,如果array[i] < array[i-1]则进行交换,如最左侧的一列,35交换-37交换-32不换-21不换-14交换-16交换。这样就得到了第二列,循环执行。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
*
* @param array[] 要排序的数组
* length 数组长度
*/

static void bubbleSort(int array [],int length)
{
int i,j;
int change = TURE; // 用来标识之前比较过的是否已经有序

for(i=0; i<length-1 && change ; i++)
{
change = FALSE;
for(j=0; j<length-(i+1); j++)
{
if(array[j]>array[j+1])
{
int temp=array[j+1];
array[j+1]=array[j];
array[j]=temp;
change=TURE;
}
}
}
}

int main(void)
{
int a[] = { 2, 5, 3, 1, 4};
int length = sizeof a /sizeof a[0];
int i;
for (i = 0; i < length; i++)
printf("%d%s", a[i], i == length -1 ? "\n" : " ");
bubbleSort(a, length);
for (i = 0; i < length; i++)
printf("%d%s", a[i], i == length -1 ? "\n" : " ");

return 0;
}

二、快速排序

排序思想

    选取一个元素值,通过比较(从数组两侧向中间比较),比该值小得交换到其左边,大的被交换到右边,这样将待排序的数组分成两部分,左侧都比该元素值小,右侧都比该元素值大,针对每一个部分再执行以上的过程,直到不能再分为止。

图解

    元素选取: 每一次以该组数组的第一个值作为被选取得元素值。一次排序后分成两部分,左侧比4小,右侧比4大。不断执行该过程

代码实现

    递归方式实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
void quickSort(int array[], int length) {
if( length <= 1 ) return;

int i=0, j=length-1, temp = array[0];
while( i<j ) {
while( array[j]>temp && j>i ) j--; array[i] = array[j];
while( array[i]<=temp && i<j ) i++; array[j] = array[i];
}
array[i] = temp;
sort(array, i);
sort(array+i+1, length-i-1);
return;
}


本文为作者原创文章,未经作者允许不得转载。

...

...

00:00
00:00