幾種排序方法的實現(更新中)

2022-09-03 01:24:08 字數 2610 閱讀 4588

假設當前排序到了第i個元素arr[i],則此時i左側[0,i-1]已經有序,對於arr[i]來說,如果arr[i]>=arr[i-1],則不用排序,直接進入[i+1];否則要在左側有序表中找到乙個合適的位置j令arr[j]<=arr[i]每一趟插入排序,令當前有序表的長度增加1,直至有序長度等於陣列長度。

class solution 

} return;}};

和普通的直接插入排序相比,折半插入排序利用了左側有序表的特性,利用折半查詢減少了查詢次數,但移動次數仍然未改變。

class solution 

int tmp=arr[i];

for(int j=i-1;j>=high+1;j--)

arr[j+1]=arr[j];

arr[high+1]=tmp;

} }

};

直接插入排序折半排序都沒有實際上減少移動次數,折半排序優化的是比較次數。

希爾排序的思想在於:

如果乙個序列是正序的,則對它進行排序只用比較n-1次,而不用移動。因此,如果對於某個待排點i來說,如果i左側的陣列能夠基本有序(不是完全有序),則它移動的次數將減少。

希爾排序每一趟排序中,根據增量將序列分為若干組,每一組進行乙個直接插入排序,這樣每一組都是有序的,再將他們組合起來,也就是說,每一組都將這組的資料小的往前置頂,大的往後置後,則合併起來時相對整個陣列來說,它的小資料集中到了前段,大資料集中到了後端,儘管不同的子組間的大小沒有確定,但對於陣列整體來說,它比這一趟希爾排序前變得更有序了。

這樣,每進行一趟希爾排序,陣列的有序情況得到一定改善,直到最後增量為1時,相對來說比最初的陣列的有序性更強了,在進行一次完整的直接插入排序,這樣減少了插入過程中的移動次數。

class solution 

} }};

交換排序,藉由交換進行排序的方法。

class

solution }}

};

定義乙個操作partition,對陣列的某個位置i進行partition,將使該陣列中所有小於等於arr[i]的元素都在i的左側,使所有大於arr[i]的元素都在i的右側。

繼續對i的左側和右側繼續進行parition,直到最後,陣列整體有序。

class solution 

private:

void qsortcore(vector& arr,int low,int high)

int partition(vector&arr,int low,int high)

arr[high]=tmp;

return low;

}};

快排的退化:

快排用的是分治的思想,拆解開後一般就是一顆二叉樹的深度是log n,每一層進行交換的複雜度為n,所以為n log n;最壞的情況就是陣列剛好有序,這種情況下樹的深度為n,因此整體複雜度將退化為n^2.

也就是說,快排的複雜度與輸入序列的順序有關。

最理想的一種就是下圖所示,序列為:,每次找到的parition的值剛好是中間值(預設paritition的位置是陣列的第乙個元素)。

而如果陣列是有序的,則相當於構造了乙個,第一次parition位置在10,從high一直搜尋到20位置。第二次在10右側的20進行parition,.......,如此下去,複雜度成為n^2。乙個有序的輸入序列,相當於構造了乙個深度為n的單枝樹,而每一次partition都要搜尋n,相當於o(n^2)的複雜度。

每一趟選擇乙個從n-i個元素中選擇乙個最小的,放置在第i個位置。這樣n-1輪後將陣列有序。

class solution 

return;

}private:

void heapsortcore(vector& arr,int pos,int end)

arr[pos]=tmp;

}};

降序:

class solution

return;

}private:

void heapsortcore(vector& arr,int pos,int end)

arr[pos]=tmp;

}};

堆排的特點在於它形成的結構一定是接近於完全二叉樹,而不會像快排一樣由於輸入的不同而形成單支樹,因此堆排在最壞情況下也依然為nlogn的時間複雜度。堆排由於第一次需要進行堆的初始化來建設初始堆,因此比其他排序多了初始堆建設的複雜度,因此不提倡應用於記錄數較小的情況。

採用分治的思想,將整個陣列分為兩個陣列,兩個陣列排序後在集成為乙個有序陣列。

嚴蔚敏的寫法真的實屬睿智

class solution

private:

void msortcore(vector& arr,int start,int end)

else

}if(p1<=mid)

if(p2<=end)

for(int i=start;i<=end;i++)

return;

}};

常見的幾種排序方法實現

常見的幾種排序方法 氣泡排序 選擇排序 插入排序 選擇排序 1 氣泡排序 每次比較相鄰的像個數,值小的往前冒泡,時間複雜度o n2 2 選擇排序 每次選擇最小的乙個數放在前面,時間複雜度o n2 3 插入排序 每個數插入前面的有序數列中,時間複雜度o n2 4 選擇排序 利用遞迴方法,不斷將小於某個...

c 實現幾種排序方法

1.簡介 插入排序 insertion sort 的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in place排序 即只需用到o 1 的額外空間的排序 因而在從後向前掃瞄過程中,需要...

Java實現幾種常見排序方法

1.冒泡演算法 就是每次相鄰的兩個元素比較,如果第乙個比第二個大,就交換位置,大的 下沉 小的 上漂 迴圈每次找出最大的那個,以此類推,比較length 1次。2.選擇排序 選擇排序是一種簡單直觀的排序方法,每次尋找序列中的最小值,然後放在替換當前迴圈的最小位的位置。3.插入排序 認為第乙個元素已經...