算法---排序算法---詳細代碼

交換排序

一旦發現秩序不滿足要求時就進行交換,知道整個序列滿足要求爲止。

  • 冒泡排序

#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
  int a[5] = {3,1,4,5,2} ;//待排序數組
  for(int i =0 ; i<4;i++)
  {
  	for(int j = 0 ;j<4-i;j++)
	  {
	  	if(a[j] > a[j+1])
	  	{
	  		int temp =a[j];
	  		a[j] = a[j+1];
	  		a[j+1] = temp;
		  }
	   } 
  } 
	for(int i = 0; i<5 ; i++)
	{
		printf("%d",a[i]); 
	}
	return 0;
 } 

運行結果:

假設待排序序列有n個,則需要n-1次比較,每一次中有n-i次比較。

算法分析:

時間複雜度:

最好的情況:只需進行一趟排序,在排序過程中進行n-1次關鍵字間的比較,且不移動記錄。(排序一個已經拍好的序列)

最壞情況:需進行n-1趟排序,總的關鍵字比較次數KCN和記錄移動次數RMN(每次交換都要移動三次記錄)。

KCN=n(n-1)/2 

RMN = 3n(n-1)/2

空間複雜度:

只需要一個輔助存儲空間,所以空間複雜度爲O(1).

算法特點:

(1)穩定排序(因爲只有大於的情況下才交換位置)。

(2)可用於鏈式存儲結構。

(3)移動記錄次數較多,算法平均時間性能比直接插入排序差。當初始記錄無序,n較大時,此算法不宜採用。

  • 快速排序

由冒泡排序改進而得

選擇待排序表中的第一個記錄作爲樞紐,附設兩個指針low和high,初始時分別指向表的下界和上界

  • 選擇排序

簡單選擇排序

是最簡單的排序算法之一,每次都從待排序序列中選出最小的元素,插入到已經拍好的序列之中。

void selectSort()
 {
 	for( int i = 0 ;i <= n; i++ )//進行n趟操作 
 	{
 		int k=i;
 		for( int j = i ;j <= n; j++ ) //選出【1,n】中最小的元素,下標爲K。 
 		{
 			if( A[j] < A[k] )
 			{
 				k = j;
			 }
	 int temp = A[i];
	 A[i] = A[k] ;
	 A[k] = temp;
    }
 }

時間複雜度分析:

所需進行的移動次數較少:    最好情況:不移動      ;

                                             最壞情況:3(n-1)  ;

關鍵字的比較次數你  n(n-1),

空間複雜度:O(1);

樹形選擇排序

 

待排序的序列都作爲葉子節點

堆排序

較難

分治法:

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章