資料結構之排序

2021-07-15 12:15:43 字數 3748 閱讀 9245

常用的幾種排序方法:冒泡、插入、選擇、快排、歸併排序

1、冒泡

以公升序為例,也是有兩種思路,(1)num[0]依次與後面比較將最小的放到第一位(2)將最大的放到最後一位。我比較習慣用第一種

(1)#include

#include

using namespace std;  

int main()  

}for(int i=0;icout<

(2)#include 

using

namespace

std;  

#define maxn 100

inta[maxn + 1]; 

//全域性變數存陣列

intmain()    

intlen=i;

//陣列有效長度

for(i=0;i

}  }  cout<

<

for(j = 0; j 

cout

0;    

}  時間複雜度,最差、平均都

是o(n*n)

,最好是o(n),空間複雜度 1,是一種

穩定的排序

2、插入

插入排序(insertion sort)

的基本思想:每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排序好的序列中,直到全部記錄插入完成為止.

時間複雜度,最差、平均都是

o(n*n)

,最好是o(n),空間複雜度 1,是一種

穩定的排序

#include

#include

using namespace std;  

int main()  

else  

break;  

}num[j+1]=b;

}for(int i=0;icout<

3、選擇排序

先把0位置設定為索引,接著用index(索引)向後找最小的,  每一趟分別把最小的放在前面,然後和原來前面的資料交換位置。

時間複雜度,最差、平均都是

o(n*n)

,空間複雜度 1,是一種

不穩定的排序

#include

#include

using namespace std;  

int main()  

if(b!=i)

}for(int i=0;icout<

4、快速排序

時間複雜度,最差

o(n*n)

,平均是

o(n*logn)

,空間複雜度 

o(logn)

,是一種不穩定

的排序#include

#include

using namespace std; 

int findpos(int *a,int low,int high)

a[low]=val;

return low;

}void  quicksort(int *a,int low,int high)

}int main()  

while

(i c[k++] = a[i++];    

while

(j c[k++] = b[j++];    

}   

可以看出合併有序數列的效率是比較高的,可以達到o(n)

解決了上面的合併有序數列問題,再來看歸併排序,其的基本思路就是將陣列分成二組a,b,如果這二組組內的資料都是有序的,那麼就可以很方便的將這二組資料進行排序。如何讓這二組組內資料有序了?

可以將a,b組各自再分成二組。依次類推,當分出來的小組只有乙個資料時,可以認為這個小組組內已經達到了有序,然後再合併相鄰的二個小組就可以了。這樣通過先遞

歸的分解數列,再合

並數列就完成了

歸併排序。

#include 

using

namespace

std;  

#define maxn 100

inta[maxn + 1]; 

//全域性變數存陣列,初始值

//將有二個有序數列a[first...mid]和a[mid...last]合併。  

void

mergearray(

inta, 

intfirst, 

intmid, 

intlast, 

inttemp)    

while

(i <= m)    

temp[k++] = a[i++];    

while

(j <= n)    

temp[k++] = a[j++];    

for(i = 0; i 

a[first + i] = temp[i];    

}    

void

mergesort(

inta, 

intfirst, 

intlast, 

inttemp)    

}  bool

mergesort(

inta, 

intn)    

intmain()    

intlen=i;

//陣列有效長度

if(mergesort(a,len)==

true

)      

cout

return

0;    

}  時間複雜度,最差、平均、最好都是

o(n*logn)

,空間複雜度

o(n),是一種

穩定的排序

6、堆排序

/*
堆排序(大頂堆) 2011.9.14

*/ #include #includeusing

namespace std;

void heapadjust(int *a,int i,int size) //

調整堆

if(rchild<=size&&a[rchild]>a[max])

if(max!=i)

}

}void buildheap(int *a,int size) //

建立堆

} void heapsort(int *a,int size) //

堆排序

冒泡是按大小位置先確定依次找位置,和選擇排序不同的是,冒泡每次比較大小都要交換位置,但是選擇排序是先確定最小值的位置,再進行交換。

插入排序是從第乙個元素開始讓數列有序,如果帶插入元素比有序的大,直接插在最後面,如果比有序的最後乙個小,那依次往前比較,尋找比它小的插在它的後面,每一次往前比較時有序數列往後依次移動

快速排序是根據元素的值找它的位置,先找第乙個元素的位置,兩個指標分別從高低遍歷,高指標先開始遇到比第乙個小的就放到第乙個,低指標後開始,遇到比它大的放到空位置,直到高低指標相當就是第乙個元素的位置

資料結構之排序

在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的 若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。穩定的排序 時間複雜度 空間複雜度 氣泡排序 最差和平均是o n2 最好是o n 1 雙向氣泡排序 最...

資料結構之排序

package com.small 注意a 0 是否有意思,書上c語言基本都是將a 0 作為哨兵,那麼0號元素不能用,我這裡全部是flag代替 author small leaf public class sort else for j i 1 j high 1 j a high 1 flag 希爾...

資料結構之排序

目錄 氣泡排序 選擇排序 插入排序 shell排序 歸併排序 快速排序 堆排序void bubblesort int arr,int size 每一輪迴圈都把最小的數放在陣列的前半部分 void selectsort int arr,int size if arr min arr i 如果min已被...