排序算法大全

32 篇文章 0 订阅
3 篇文章 0 订阅
#include <stdio.h>
#include <Windows.h>
#define  N 10
#define  FOR  //for循环实现
//#define  WHILE//while循环实现
//#define  DOWHILE//dowhile循环实现
//#define  GOTO//goto循环实现
//#define  BACK//递归实现    


void insort(int s[], int n); //直接插入排序
void slsort(int s[], int n); //希尔排序
void mpsort(int s[], int n);//冒泡排序
void qtsort(int s[], int start, int end);//快速排序
void cgsort(int s[], int n);//选择排序


void gb(int r[], int s[], int init1, int init2, int init3);
void gbsort(int r[], int s[], int m, int n);//归并排序




void  main(int argc, char* argv[])
{
int a[N] = { 46,6345,345,3424,67,366,457,235,678,599 };
printf("排序前:\n");
for (int i = 0; i < N; i++)
{
printf("%5d", a[i]);
}




//insort(a, N); //直接插入排序
//slsort(a, N); //希尔排序
mpsort(a, N);//冒泡排序
//qtsort(a, 0, N-1);快速排序
//cgsort(a, N);//选择排序
//gbsort(a, a,0, N - 1);//归并排序
printf("\n 排序后:\n");
for (int i = 0; i < N; i++)
{
printf("%5d", a[i]);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
}
getchar();
}




#ifdef   FOR
void gb(int t[], int s[], int start, int p, int end)
{
int i = start, j = p + 1, k = start;
for (;(i <= p) && (j <= end);k++)
{
if (t[i] <= t[j])
{
s[k] = t[i];
i++;
}
else
{
s[k] = t[j];
j++;
}
}
for (;i <= p;s[k++] = t[i++]);
for (;j <= end;s[k++] = t[j++]);
}
void gbsort(int s[], int r[], int start, int end)//归并排序
{
int p, t[2 * N];
if (start == end)  //对t[2N]进行赋值
{
r[start] = s[start];
}
else
{
p = (start + end) / 2;
gbsort(s, t, start, p);
gbsort(s, t, p + 1, end);
gb(t, r, start, p, end);
}


}




void qtsort(int s[], int start, int end)//快速排序
{
int  temp = s[start];
for (int i = start, j = end;i < j;)
{
for (;temp < s[j] && i < j;j--); //end左移
if (i<j)
{
s[i] = s[j];
i++;
}
for (;i < j&&s[i] <= temp;i++); //start右移
if (i<j)
{
s[j] = s[i];
j--;
}
s[i] = temp;
if (start <i)  //递归调用
{
qtsort(s, start, j - 1);
}
if (i< end)
{
qtsort(s, j + 1, end);
}
}
}


void mpsort(int s[], int n)//冒泡排序
{
for (int i = 0; i < n - 1; i++)
{
int prit[N][N] = { 0 };
int flog[N][N] = { 0 };
printf("\n\n第%d轮循环:\n",i+1);
printf("\n");
for (int k = 0;k < N;k++)
{
prit[k][i] = s[k];
}
flog[0][i] = 1;
int im = i+1;
for (int j = 0;j < n - 1 - i;j++)
{
if (s[j] < s[j + 1])
{
int temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;

for (int k = 0;k < N;k++)
{
prit[k][im] = s[k];
if (k == j+1)
{
flog[k][im] = 1;
}
}
im++;
}
else
{
for (int k = 0;k < N;k++)
{
prit[k][im] = s[k];
if (k == j+1)
{
flog[k][im] = 1;
}
}
im++;
}
}
for (int k = N-1;k >=0;k--)
{
for (int y = 0;y < N;y++)
{
if(prit[k][y] !=0)
{
//printf("%d\t", prit[N - k - 1][y]);
printf("%d\t", prit[k][y]);
if (flog[k][(y+1)%10] == 1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE);
}
}

}
printf("\n");
}
}
}


//void mpsort(int s[], int n)//冒泡排序
//{
// for (int i = 0; i < n - 1; i++)
// {
// for (int j = 0;j < n - 1 - i;j++)
// {
// if (s[j] < s[j + 1])
// {
// int temp = s[j];
// s[j] = s[j + 1];
// s[j + 1] = temp;
// }
// }
// }
//}




void cgsort(int s[], int n)//选择排序
{
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1;j < n;j++)
{
if (s[i] > s[j])
{
int temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
}




void slsort(int s[], int n)//希尔排序
{
int  j, d, temp = 0;
for (d = n / 2;d >= 1;d /= 2)  //排序先觉条件,log2(d)+1为大循环次数
{
for (int i = d; i < n; i++)   // 2 4  8 16 。。。 组
{
temp = s[i];
for (j = i - d;temp < s[j];j -= d)
{
s[j + d] = s[j];
}
s[j + d] = temp;
}
}
}




void insort(int s[], int n) //直接插入排序
{
int  j = 0;
int temp = 0;
for (int i = 1; i < n; i++)
{
temp = s[i];   //temp为中转站,存放需要交换的值,从第二个值开始进行比较
for (j = i - 1;temp < s[j];j--)  //插入数据  < 则是从小到大排序,>从大到小
{
s[j + 1] = s[j];
}
s[j + 1] = temp;
}
}
#endif
#ifdef  WHILE
void qtsort(int s[], int start, int end)//快速排序
{
int i = start, j = end, temp = s[start];
while (i < j)
{
while (temp < s[j] && i< j) //end左移
{
j--;
}
if (i<j)
{
s[i] = s[j];
i++;
}
while (i<j&&s[i] <= temp)  //start右移
{
i++;
}
if (i<j)
{
s[j] = s[i];
j--;
}
s[i] = temp;
if (start <i)  //递归调用
{
qtsort(s, start, j - 1);
}
if (i< end)
{
qtsort(s, j + 1, end);
}
}
}


void cgsort(int s[], int n)//选择排序
{
int i = 0;
while (i < n - 1)
{
int j = i + 1;
while (j < n)
{
if (s[i] > s[j])
{
int temp = s[i];
s[i] = s[j];
s[j] = temp;
}
j++;
}
i++;
}
}


void mpsort(int s[], int n)//冒泡排序
{
int i = 0;
while (i < n - 1)
{
int j = 0;
while (j < n - 1 - i)
{
if (s[j] > s[j + 1])
{
int temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;
}
j++;
}
i++;
}
}


void slsort(int s[], int n)//希尔排序
{
int  j, d, temp = 0;
d = n;
while (d >= 1)  //排序先觉条件,log2(d)+1为大循环次数
{
int i = d;
while (i < n)   // 2 4  8 16 。。。 组
{
temp = s[i];
j = i - d;
while (temp < s[j])
{
s[j + d] = s[j];
j = j - d;
}
s[j + d] = temp;
i++;
}
d = d / 2;
}
}


void insort(int s[], int n) //直接插入排序
{
int  j = 0, i = 1, temp = 0;
while (i<n)
{
temp = s[i];   //temp为中转站,存放需要交换的值
j = i - 1;
while (temp < s[j])  //插入数据  < 则是从小到大排序,>从大到小
{
s[j + 1] = s[j];
j--;
}
s[j + 1] = temp;
i++;
}
}
#endif


#ifdef BACK
void gb(int t[], int s[], int start, int p, int end)
{
int i = start, j = p + 1, k = start;
for (;(i <= p) && (j <= end);k++)
{
if (t[i] <= t[j])
{
s[k] = t[i];
i++;
}
else
{
s[k] = t[j];
j++;
}
}
for (;i <= p;s[k++] = t[i++]);
for (;j <= end;s[k++] = t[j++]);
}
void gbsort(int s[], int r[], int start, int end)//归并排序
{
int p, t[2 * N];
if (start == end)  //对t[2N]进行赋值
{
r[start] = s[start];
}
else
{
p = (start + end) / 2;
gbsort(s, t, start, p);
gbsort(s, t, p + 1, end);
gb(t, r, start, p, end);
}


}




void qtsort(int s[], int start, int end)//快速排序
{
int  temp = s[start];
for (int i = start, j = end;i < j;)
{
for (;temp < s[j] && i < j;j--); //end左移
if (i<j)
{
s[i] = s[j];
i++;
}
for (;i < j&&s[i] <= temp;i++); //start右移
if (i<j)
{
s[j] = s[i];
j--;
}
s[i] = temp;
if (start <i)  //递归调用
{
qtsort(s, start, j - 1);
}
if (i< end)
{
qtsort(s, j + 1, end);
}
}
}


void mpsort(int s[], int n)//冒泡排序
{
if (n - 1 >= 0)
{
mpsort(s, n - 1);
}


for (int j = 0;j < N - 1 - n&&n < N - 1;j++)
{
if (s[j] > s[j + 1])
{
int temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;
}
}
}


void cgsort(int s[], int n)//选择排序
{
if (n - 1 >= 0)
{
cgsort(s, n - 1);
}
for (int j = n - 1 + 1;j < N;j++)
{
if (s[n - 1] > s[j])
{
int temp = s[n - 1];
s[n - 1] = s[j];
s[j] = temp;
}
}
}


#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值