几种排序算法整理

来源:互联网 发布:metismenu.js 编辑:程序博客网 时间:2024/06/04 20:02

1. 关于冒泡排序算法:

Bubble Sort

冒泡法排序时,用两个for循环实现;

循环开始时,首先用第一个元素与第二个元素比较,根据升序或是降序的条件来决定是否要交换位置;不管是否交换了位置,内循环都自增一次,然后继续进行根据条件交换位置,直到内循环达到了N-1-i;此时外循环自增一次,外循环的结束条件是N-1次;

算法实现:

经典方法:

#include <stdio.h>

#define N 10

int main (void)

{

int i, j;

int array[N] = {9, 2, 5, 0, 7, 6, 1, 3, 4, 8};

for(i = 0 ; i < N ; i++)

{

for(j = 0 ; j < N - 1 - i ; j++)

{

if(array[j] < array[j+1])

{

temp = array[j];

array[j] = array[j+1];

array[j+1] = temp;

}

}

}

return 0;

}

优化冒泡:

#include <stdio.h>

#define N 10

int main (void) 

{

int i, j;

int array[N] = {9, 2, 5, 0, 7, 6, 1, 3, 4, 8};

for(i = 0 ; i < N-1 ; i++)              //就是这一句优化了,少比较了一次;

{

for(j = N-1 ; j > i ; j--)

{

if(array[j] < array[j-1])

{

temp = array[j];

array[j] = array[j-1];

array[j-1] = temp;

}

}

}

return 0;

}

2. 关于选择排序算法:

Selection Sort

选择排序也是用两个for循环实现;

外循环由有多少要排的数字决定(N)

内循环表示在剩余的元素中找到值最小的那个元素(默认是升序排序);

算法实现:

#include <stdio.h>

#define N 10

int main (void)

{

int i, j, min, temp;

int array[N] = {9, 2, 5, 0, 7, 6, 1, 3, 4, 8};

for(i = 0 ; i < N ; i++)

{

for(min = i , j = i + 1 ; j < N ; j++)

{

if(array[j] < min)

min = j;

}

if(min != i) //这一句可有可无,但是可以在第一个元素就是最小值时减少一次交换

{

temp = array[i];

array[i] = array[min];

array[min] = temp;

}

}

return 0;

}

 

3. 关于插入排序算法:

Insertion Sort

插入排序同样需要两个for循环;

首先外循环从第二个元素开始,将第二个元素与第一个元素比较,如果第二个元素较小,则交换排序;然后外循环自增一次;

内循环主要是将要进行排序的元素与已经排好序的序列比较,将比要比较的元素大的元素依次后移;

最后将之前保存的元素插入相应的位置即可;

算法实现:

#include <stdio.h>

#define N 10

int main (void)

{

int i, j, temp;

int array[N] = {9, 2, 5, 0, 7, 6, 1, 3, 4, 8};

for(i = 1 ; i < N ; i++)

{

if(array[i] < array[i-1])

{

temp = array[i];      //将比较的数字保存起来;

for(j = i-1 ; temp < array[j] ; j--)

array[j+1] = array[j];       //将已经排好序的序列后移;

array[j+1] = temp;

}

}

return 0;

}

4. 关于快速排序算法:

Quick Sort

快速排序可以用递归的思想实现;

使用递归时,需要特别注意递归退出的条件;

需要两个索引,一个指向第一个元素,另一个指向最后一个元素,并且每一次划分的第一个元素称为一个key

首先从后向前搜索,如果j指向的值小于key,那么交换ij对应的元素,然后索引j往前移一位;

然后从前向后搜索,如果i指向的值大于key,那么交换ij对应的元素,然后索引i向后移一位;

i等于j的时候,循环结束。

算法实现:

void QuickSort(int array[], int n)

{

if(n <= 1)         //递归退出的条件;

return;

int i =0 , j = n - 1;

int key = array[0];

int index = 0;

int temp;

while(i < j)

{  

while(i < j && array[j] > key)         //从后向前搜索;

j--;

if(j == i)

break;

else

{

temp = array[i];

array[i] = array[j];

array[j] = temp;

index = j;

}

while(i < j && array[i] < key)          //从前向后搜索;

i++;

if(i == j)

break;

else

{

temp = array[i];

array[i] = array[j];

array[j] = temp;

index = i;

}             

}     

QuickSort(array, index);

QuickSort(array + index + 1, n - 1 - index);

}