常見的幾種排序

2021-09-01 11:20:23 字數 2768 閱讀 5434

一、氣泡排序:

二 、直接選擇排序:

三、直接插入排序:

四、希爾排序

五、快速排序

快速排序三種找基準方式及兩種優化

六、堆排

七、歸併排序

時間複雜性:一般平均是o(n^2),最好的情況是o(n),最壞的情況是o(n^2)。

空間複雜性:o(1)。

穩定性:穩定排序。

氣泡排序的原理:

1、比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

2、對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

3、針對所有的元素重複以上的步驟,除了最後乙個。

4、持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

#includevoid bubblesort(int *arr,int len)

} if(!swap)

}}void show(int *arr,int len)

else

}arr[j+1]=temp;

} }void show(int *arr,int len)

else

}arr[j+gap]=temp; }}

void shellsort(int *arr,int len)

; int lend = sizeof(drr)/sizeof(drr[0]);

for(int i = 0;i < lend;i++) }

void show(int *arr,int len)

arr[low]=arr[high];

while(lowlow)

if(key+1low)

while(top>0) }

free(stack);

stack =null;

}void show(int *arr,int len)

; int len = sizeof(arr)/sizeof(arr[0]);

srand(time(null));

for(int i=0;i3、三數取中法:

void swap(int *arr,int low,int high)

void selectpivotmedianofthree(int *arr,int low,int high)

if(arr[mid]>arr[low])

}

快速排序兩種優化方式

1、聚集相同基準法

void focusnumpar(int *arr,int low,int high,int par,int *left,int *right )

else

}} *left=parleft;

int parright=par+1;

for(int i=par+1;i<=high;i++)

else

}} *right=parright;

}}

2、當資料量很少時,採用直接插入排序

void insertsort(int *arr,int low,int high)

else

}arr[j+1]=temp;

}}

在堆的資料結構中,堆中的最大值總是位於根節點(在優先佇列中使用堆的話堆中的最小值位於根節點)。堆中定義以下幾種操作:

1、最大堆調整(max heapify):將堆的末端子節點作調整,使得子節點永遠小於父節點

2、建立最大堆(build max heap):將堆中的所有資料重新排序

3、堆排序(heapsort):移除位在第乙個資料的根節點,並做最大堆調整的遞迴運算 

時間複雜性:一般平均是o(nlog2n),最好的情況是o(nlog2n),最壞的情況是o(nlog2n)。

空間複雜性:o(1)。

穩定性:不穩定排序。

**如下:

#include#include#includevoid swap(int *arr,int start,int end)

}void fun2(int *arr,int len)

}void show(int *arr,int len)

else

}while(start1 <= end1)

while(start2 <= end2)

//找兩個新的歸併段

start1 = end2+1;

end1 = start1+gap-1;

start2 = end1+1;

end2 = start2+gap-1 < len-1?start2+gap-1:len-1;

} while(start1 < len)

for(int i = 0;i < len;i++) }

void mergesort(int *arr,int len)

}void show(int *arr,int len)

printf("\n");

}int main()

; int len = sizeof(arr)/sizeof(arr[0]);

mergesort(arr,len);

show(arr,len);

return 0;

}

執行結果:

以上是目前總結的七種排序,在八大排序中,還有乙個基數排序,這個目前不做討論。

常見的幾種排序

常見的排序 選擇排序 直接選擇排序 堆排序 交換排序 氣泡排序 直接交換排序 插入排序 直接插入排序 shell排序 折半插入排序 歸併排序 基數排序 1.選擇排序 1.1直接選擇排序 選擇排序 直接選擇排序 每迴圈一次取出其中最大或者最小的乙個 插入到靠前或者靠後的位置 當然第一次從0開始,第二次...

常見的幾種排序

前言 最近聽公尺老師講了一遍排序,之前上課老師也講過,這次又聽了一遍,對排序有了更進一步的認識。接下來介紹一下最常見的幾種排序,以及自己對排序的理解。插入排序 插入排序包括 直接插入排序與shell排序 1.直接插入排序 概念 通過線性搜尋來確定待插入記錄的位置 演算法 圖中每一行的資料表示插入了第...

幾種常見的排序

1 插入排序 for int i 1 i n i 2 氣泡排序 for int i 0 i n 1 i 3 選擇排序 for int i 0 i n 1 i swap array,i,lowindex 4 快速排序 void swap int a,int i,int j int partition ...