對於乙個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...