牛客網演算法學習記錄 排序

2021-07-11 21:33:29 字數 3837 閱讀 9382

對於乙個int陣列,請編寫乙個氣泡排序演算法,對陣列元素排序。

給定乙個int陣列a及陣列的大小n,請返回排序後的陣列。 

測試樣例:

[1,2,3,5,2,3],6
[1,2,2,3,3,5]
測試用例子只有正數。
公升序

氣泡排序:比較簡單,主要就是注意排序時陣列的邊界。

for(int i=0;ia[j+1])

}}

return a;

選擇排序:比較簡單,注意概念即可。
它的工作原理是每一次從待排序的

資料元素

中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。

int* selectionsort(int* a, int n)

else

}if(changed)

a[j+1] = value;

}return a;

歸併排序:先通過遞迴進行切分,然後使用兩個陣列合併為乙個陣列的方法進行排序,由於遞迴分割的原因,每次呼叫排序函式時,兩個分塊是各自有序的

class mergesort

void mergesortarray(int *a,int first,int mid,int last)

else

}if(i > mid)

}else if (j>last)

}i=first;

for(int k = 0 ; k =value 沒有寫等於號,導致樣例死迴圈,就是陣列索引中的具體值是相等的 但是索引本身符合low

void qsort(int *a, int low, int high)

}int partition(int *a, int low, int high)

a[low] = value;

return low;

}int* quicksort(int* a, int n)

堆排序:主要是借助完全二叉樹的性質進行的,包括完全二叉樹 和 第乙個元素從1開始的陣列下標的對應關係,縮短陣列邊界,然後按層次進行比較進行的。

void heapsort(int *a, int length)

for (int i = length; i > 1;i--)

}void heapadjust(int *a,int s,int m)

if (r >= a[j])

//大的元素上移

a[s] = a[j];

s = j;

}//賦值到調整後的節點

a[s] = r;

}但是題目中的樣例給的是從0開始的陣列,所以要另外找規律,發現,原來length/2 現在成了,length(奇數) :(length-3)/2  length(偶數):(length-2)/2,但是沒有通過。

錯誤**:(目前不知道怎麼改。)

void heapadjust(int *a,int s,int m)

if (r >= a[j])

//大的元素上移

a[s] = a[j];

s = j;

}//賦值到調整後的節點

a[s] = r;

}int* heapsort(int* a, int n)

else

for (int i = start;i >=0;i--)

for (int i = n - 1; i > 1;i--)

return a;

}希爾排序:有步長的插入排序;

void shellinsert(int *a,int step,int lena)

a[j + step] = t;}}

}int* shellsort(int* a, int n) ;

for (int i = 0; i < 3;i++)

return a;

}計數排序:

max-min是為了縮小範圍,減少空間

int* countingsort(int* a, int n)

min = a[0];

max = a[0];

for (int i = 0; i < n; i++)

if (a[i] > max)

}int count = max - min + 1;

int counter[count];

for (int i = 0; i < count; i++)

for(int i = 0; i < n; i++)

int it = 0;

for (int k = 0; k < count; k++)

}return a;

}基數排序:先將所有資料按個位數字的大小放入排序容器,再按0~9容器從第乙個元素開始重新輸出,覆蓋原陣列,再按十位數字大小放入容器進行排序,此時同一容器中的數字是按個位遞增的順序進行排列的,以此類推,對於不滿足位數要求的數字,mod時相當於在數字前面補0。

int getindex(int number,int mod)

//所有元素只有個位時,直接排序

void sort(int *a,int n)}}

}基數排序

int* radixsort(int* a, int n)

//找到最大 數

for (int i = 0 ;i max)

}int mod = 10,flag1;

//找到最大數的位數

for(int i = 1;i<10;i++)

else

}//全是個位數

if(flag1 == 0)

else

int negnum = 0; // arr÷–∏∫ ˝µƒ∏ˆ ˝

for (int i = 0; i < arr.length; i++)

int negarr = new int[negnum];

int posarr = new int[arr.length - negnum];

int negi = 0;

int posi = 0;

for (int i = 0; i < arr.length; i++) else

}radixsortforpositive(negarr);

radixsortforpositive(posarr);

int index = 0;

for (int i = negarr.length - 1; i >= 0; i--)

for (int i = 0; i < posarr.length; i++)

}public static void radixsortforpositive(int arr)

arraylist> qarr1 = new arraylist>();

arraylist> qarr2 = new arraylist>();

for (int i = 0; i < 10; i++)

for (int i = 0; i < arr.length; i++)

long base = 10;

while (base <= integer.max_value)

}arraylist> tmp = qarr1;

qarr1 = qarr2;

qarr2 = tmp;

base *= 10;

}int index = 0;

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

空間複雜度:

o(1):插入排序,選擇排序,氣泡排序,堆排序,希爾排序

o(logn)~o(n):快速排序

o(n):歸併排序

o(m):基數排序,計數排序 。(m為你選擇的用於排列的容器數量)

牛客網演算法學習記錄 概率

n只螞蟻從正n邊形的n個定點沿著邊移動,速度是相同的,問它們碰頭的概率是多少?給定乙個正整數n,請返回乙個陣列,其中兩個元素分別為結果的分子和分母,請化為最簡分數。測試樣例 3返回 3,4 因為是正n邊型,所以所有的點的路程相同。他們的速度又是相同的。從總情況來說,乙個結點有兩種選擇,那麼n個結點就...

牛客演算法學習2

title 牛客演算法學習2 date 2019 07 28 19 34 47 categories 在實現棧的基本功能的基礎上,再實現返 回棧中最小元素的操作。1 pop push getmin操作的時間複雜度都是o 1 2 設計的棧型別可以使用現成的棧結構 用棧實現佇列 因為棧是先進後出的,假設...

牛客網演算法學習筆記 排列組合

在xxy的方格中,以左上角格仔為起點,右下角格仔為終點,每次只能向下走或者向右走,請問一共有多少種不同的走法 給定兩個正整數int x,int y,請返回走法數目。保證x y小於等於12。測試樣例 2,2返回 2橫向要走x 1步,縱向要走y 1步,總共需要走,x y 2步,其中有x 1橫向。ccla...