冒泡排序
void BubbleSort(int arr[],int n){
if(n==1||n==0) return;
for(int e=n-1;e>0;e--){
for(int i=0;i<e;i++){
if(arr[i]>arr[i+1])
swap(arr,i,i+1);
}
}
}
void swap(int arr[],int i,int j){
arr[i]=arr[i]^arr[j];
arr[j]=arr[i]^arr[j];
arr[i]=arr[i]^arr[j];
}
插入排序
void InsertSort(int arr[],int n){
if(n==1||n==0) return;
for(int i=1;i<n;i++){
for(int j=i-1;j>=0&&arr[j]>arr[j+1];j--)
swap(arr,j,j+1);
}
}
選擇排序
void SelectSort(int arr[],int n){
if(n==1||n==0) return;
for(int i=0;i<n-1;i++){
int minIndex=i;
for(int j=i+1;j<n;j++){
minIndex=arr[j]<arr[minIndex]?j:minIndex;
}
swap(arr,i,minIndex);
}
}
歸併排序
void mergeSort(int arr[],int l,int r){
if(l==r) return;
int mid=l+((r-l)>>1);//防止溢出,>>代表右移一位
mergeSort(arr,l,mid);
mergeSort(arr,mid+1,r);
merge(arr,l,mid,r);
}
void merge(int arr[],int l,int m,int r){
int help[MAXSIZE];
int i=0,p1=l,p2=m+1;
while(p1<=m&&p2<=r)
help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
while(p1<=m)
help[i++]=arr[p1++];
while(p2<=r)
help[i++]=arr[p2++];
for(i=0;i<sizeof(help)/sizeof(int);i++)
arr[l+i]=help[i];
}
快速排序
**要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a;
要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a;
要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整數的範圍。
要取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之間的浮點數,可以使用rand() / double(RAND_MAX)。**
void QuickSort(int arr[],int l,int r){
if(l<r){
swap(arr,(rand() % (r-l))+ l),r);//隨機找到一個數,交換到隊尾,防止出現badcase:1 2 3 4 5 6這種情況
int p[2]=partition(arr,l,r);
quickSort(arr,l,p[0]-1);
quickSort(arr,p[1]+1,r);
}
}
int partition[](int arr[],int l,int r){
int less=l-1;
int more=r;
while(l<more){
if(arr[l]<arr[r])
swap(arr,++less,l++);
else if(arr[l]>arr[r])
swap(arr,--more,l);
else
l++;
}
swap(arr,more,r);//將選出的part值和大於區的隊頭交換
int p[2];
p[0]=less+1;
p[1]=more;
return p;
}
注:在不申請額外空間的情況下,是很難實現將一個數組中的奇數和偶數分開,並且保持相對順序不變。