排序算法复习之——内部排序算法之——交换排序

来源:互联网 发布:java jlabel dialog 编辑:程序博客网 时间:2024/05/24 00:09

排序算法复习之——内部排序算法之——交换排序

交换排序分为:冒泡排序(稳定)、快速排序(不稳定)

交换排序的基本思想:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

1、           冒泡排序:

时间复杂度O(n*n)空间复杂度:O(1)

冒泡排序算法:依次比较相邻的两个数,将小数放在前面,大数放在后面。

在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。

在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。

如此下去,重复以上过程,直至最终完成排序。

由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。

实现很简单:就是简单的2个for循环。

实现如下:

#include "stdafx.h"#include <iostream>using namespace std;void bubble(int a[], int size){ for (int i=1;i<size; i++) {  for (int j=0;j<size-i;j++)  {   if (a[j]>a[j+1])   {    int temp=a[j];    a[j]=a[j+1];    a[j+1]=temp;   }  } } }int _tmain(int argc, _TCHAR* argv[]){ int a[]={49,38,65,97,76,13,27,49}; int size=sizeof(a)/sizeof(int); bubble(a,size); for (int k=0; k<size; k++) {  cout<<a[k]<<" "; } cout<<endl; system("pause"); return 0;}

运行结果:

2、快速排序算法:快速排序是冒泡排序的一种改进

时间复杂度O(nlogn)空间复杂度:O(logn)

基本思想:通过一趟排序将待排记录分割成独立的2部分,其中一部分记录的关键字均比另一部分记录的关键字小,则分别对这两部分记录进行排序,以达到整个序列有序。

一趟快速排序的做法:附设2个指针low和high,设枢轴记录关键字为key,则先从高位起(high)向前搜素找到第一个关键字小于key的记录和枢轴记录交换,然后从低位(low)所指的位置向后搜索,找到第一个关键字大于key的记录和枢轴记录交换,重复这两部,直至low=high为止。

实现如下:

#include "iostream"using namespace std;void quicksort(int a[], int low, int high){  int i,j,key,temp; if(low < high) {  key = a[low];  i = low;  j = high;  while(i < j)  {   for( i = i + 1; i < high; i++)    if( a[i] > key)     break;   for( j = j; j > low; j--)    if( a[j] < key)     break;   if(i < j)   { temp = a[i];   a[i] = a[j];   a[j] = temp;   }  }  temp = a[low];  a[low] = a[j];  a[j] = temp;  quicksort(a,low,j-1);  quicksort(a,i,high); }} int _tmain(int argc, _TCHAR* argv[]){ int a[]={49,38,65,97,76,13,27,49}; int size = sizeof(a)/sizeof(int);    quicksort(a,0,size-1); for (int i=0;i<size;i++) {  cout<<a[i]<<" "; } system("pause"); return 0;}

运行结果:

 

 

原创粉丝点击