各种排序
有冒泡,选择,插入,归并,快速排序问题
- 冒泡排序
void MaoPao(int s[], int len){
int i, j;
int temp;
for(i = 0; i<len; i++){
for(j = 0; j<len-i-1; j++){
if(s[j] > s[j+1]){
temp = s[j];
s[j] = s[j+1];
s[j+1] = temp;
}
}
}
}
- 选择排序
void Xz(int s[], int len){
int i, j;
int temp;
for(j = 0; j<len; j++){
for(i = j+1; i<len; i++){
if(s[j] > s[i]){
temp = s[j];
s[j] = s[i];
s[i] = temp;
}
}
}
}
- 插入排序
void insert(int a[] , int len)
{
int i, j, key;
for(j = 1; j < len; j++){
key = a[j];
i = j - 1;
while(i>=0 && a[i]>key)
{
a[i+1] = a[i];
i = i-1;
}
a[i+1] = key;
}
}
- 归并排序
void MergeSort(int A[], int p, int r, int C[])
{
if(p<r) {
int q;
q = (p+r)/2;
MergeSort(A, p, q, C);
MergeSort(A, q+1, r, C);
Merge(A, p, q, C, r);
}
}
void Merge(int A[], int p, int q, int C[], int r)
{
int i = p;
int j = q+1;
int k = 0;
while(i <= q && j <= r){
if(A[i] <= A[j]) C[k++] = A[i++];
else C[k++] = A[j++];
}
while(j <= r) C[k++] = A[j++];
while(i <= q) C[k++] = A[i++];
for(i = 0; i<k; i++) A[p+i] = C[i]; //将排好的数组再按顺序存回原数组的指定位置
}
- 快速排序 (1)
void Quicksort(int A[], int p, int r){
if(p<r){
int q, temp;
q = Partition(A, p, r);
temp = A[p]; //找到了A[p]首元素的位置后将首元素放进去
A[p] = A[q]; // 返回的位置是j标记的位置,而j是从后往前找首元素小的元素,
A[q] = temp; // A[j]肯定小于等于首元素,所以首元素跟j标记的元素交换位置.
Quicksort(A, p, q-1);
Quicksort(A, q+1, r);
}
}
int Partition(int A[], int p, int r){
int x, i, j, temp;
x = A[p];
i = p;
j = r;
while(i < j){
while(A[j] > x) j--;
while(A[i] <= x) i++;
if(i < j){
temp = A[i];
A[i] = A[j];
A[j] = temp;
}else return j;
}
}
- 快速排序 (2)
void quickSort(int a[],int left,int right){
int i=left;
int j=right;
int key=a[i]; //a[i]的值赋给key
if(left>=right)return;
while(i!=j){
while(i<j && a[j]>=key) j--;
a[i]=a[j]; //a[i]已经赋值给key,所以直接将a[j]赋值给a[i],赋值完之后a[j],有空位
while(i<j && a[i]<=key) i++;
a[j]=a[i]; //a[j]已经赋值给a[i],所以直接将a[i]赋值给a[j],赋值完之后a[i],有空位
}
a[i]=key; //此时i与j已经相等,把key的值赋给a[i],左边<KEY 右边>KEY
quickSort(a,left,i-1); //递归左边,求解子问题
quickSort(a,i+1,right); //递归右边,求解子问题
}