码迷,mamicode.com
首页 > 编程语言 > 详细

内排序小结

时间:2015-03-17 12:30:25      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:排序算法

1.冒泡排序

冒泡排序是一种交换排序,基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止

代码示例:
<span style="font-size:18px;">#include <iostream>
using namespace std;

void BubbleSort(int array[],int length){
	//排序次数比数组长度小1
	bool flag=true; 
	for(int i=0;i<length-1&&flag;i++){ //若flag为false,则退出循环
		flag=false; //初始为fasle
		for(int j=0;j<length-i-1;j++){
			if(array[j]>array[j+1]){
				int temp=array[j];
				array[j]=array[j+1];
				array[j+1]=temp;
				flag=true; //如果发生了数据交换,则flag为true
			}
		}
	}
}
int main(){
	int array[]={12,4,16,15,17,1,19,6};
	BubbleSort(array,8);
	for(int i=0;i<8;i++){
		cout<<array[i]<<" ";
	}
	cout<<endl;
	return 0;
}</span>

时间复杂度分析:最好时间复杂度为O(n),最坏时间复杂度为O(n^2),平均时间复杂度为O(n^2)
空间复杂度分析:O(1)
稳定性分析:稳定的排序算法

2.简单选择排序


基本思想:每一趟排序选择未排序记录关键字的最小值,然后和未排序记录的第一个位置交换数据
示例代码:
<span style="font-size:18px;">#include <iostream>
using namespace std;
void SimpleSelectSort(int array[],int length){
	
	int min;//最小元素下标
	//排序次数比数组长度小1
	for(int i=0;i<length-1;i++){ 
		min=i;//将当前下标定义为最小值下标
		//一趟排序找到当前未排序记录关键字的最小值
		for(int j=i+1;j<length;j++){
			if(array[min]>array[j])
				min=j;
		}
		if(min!=i){ //最小值不是当前i下标值,则交换
			int temp=array[i];
			array[i]=array[min];
			array[min]=temp;
		}
	}
}
int main(){
	int array[]={12,4,16,15,17,5,19,2};
	SimpleSelectSort(array,8);</span><pre name="code" class="cpp"><span style="font-size:18px;"><span style="white-space: pre;">	</span>for(int i=0;i<8;i++){</span>
cout<<array[i]<<" ";}cout<<endl;return 0;}


时间复杂度分析: 由于比较的次数都是O(n^2)次,所以最好、最坏、平均时间复杂度都是O(n^2)
空间复杂度分析:O(1)
稳定性分析:稳定的排序算法
简单选择排序性能上要优于冒泡排序

3.直接插入排序

基本思想:将一个记录插入到一个已经排好序的有序表中,得到一个新的、记录数加1的有序表
示例代码:
#include <iostream>
using namespace std;
void DirectInsertSort(int array[],int length){
	//排序次数比数组长度小1
	for(int i=1;i<length;i++){ 
		if(array[i]<array[i-1]){ //为true才需要真正排序
			int temp=array[i]; //设置哨兵
			int j=i-1;
			//寻找插入位置,当前j值的后一个位置是插入位置
			while(j>=0&&temp<array[j]){ 
				array[j+1]=array[j];
				j--;
			}
			array[j+1]=temp;
		}
	}
}
int main(){
	int array[]={12,4,16,15,17,5,19,2};
	DirectInsertSort(array,8);
	for(int i=0;i<8;i++){
		cout<<array[i]<<" ";
	}
	cout<<endl;
	return 0;
}
时间复杂度分析:最好时间复杂度O(n)、最坏和平均时间复杂度均为O(n^2)
空间复杂度分析:O(1)
稳定性分析:稳定的排序算法
同样的时间复杂度条件下,直接插入排序比冒泡排序和简单选择排序性能要好一些

内排序小结

标签:排序算法

原文地址:http://blog.csdn.net/sxhlovehmm/article/details/44338553

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!