排序算法大全

#include
#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章