您的位置:首页 > 其它

选择排序跟冒泡排序的比较

2015-06-29 11:26 176 查看
/*时间复杂度

选择排序:比较次数O(n^2)总的比较次数N=(n-1)+(n-2)+…+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比冒泡排序少多了,由于交需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。

冒泡排序:若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数为n-1,交换次数为0,所以,冒泡排序最好的时间复杂度为O(n); 若初始文件是反序的,需要进行趟排序。每趟排序要进行次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:C = n*(n-1)/2 M = 3n*(n-1)/2。

*/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>

//选择排序,找出每一轮最小元素放在本轮开头位置
void SelectSort(int arr[], int length)
{
int tmp, i, j;

for(i = 0; i < length-1; i++)
{
for(j = i+1; j < length; j++)
{
if(arr[i] > arr[j])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
/* 优化后的选择排序算法
for(i = 0; i < length-1; i++)//length个元素需要比较length-1轮
{
int index = i;//假设index为每轮比较后最小的元素下标 ,初始值为每轮第一个元素

for(j = i+1; j < length; j++)
{
if(arr[j] < arr[index])//index代表一局内最小的那个
index = j;
}

if(index != i)
{
tmp = arr[index];
arr[index] = arr[i];
arr[i] = tmp;
}

} */
}

//冒泡排序,每次找到轮内最大的放在本轮的最后位置
void BubbleSort(int arr[], int length)
{
int i, j, tmp;

for(i = 0; i < length-1; i++)
{
for(j = 0; j < length-1-i; j++)
{
if(arr[j] > arr [j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}

/*冒泡排序的优化

bool flag = true;
for(i = 0; i < length-1 && flag; i++)
{
flag = false;

for(j = 0; j < length-1-i; j++)
{
if(arr[j] > arr [j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
flag = true;
}
}
}
*/

}
void main()
{
int arr[8] = {2,8,5,3,4,7,9,10};
int i;

for(i = 0; i < 8; i++)
{
printf("%d ", arr[i]);
}
printf("\n");

BubbleSort(arr, 8);

for(i = 0; i < 8; i++)
{
printf("%d ", arr[i]);
}
printf("\n");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息