-
ZT 9种排序
2012-09-19 14:58 66人阅读 收藏 编辑 删除
- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
- #include <time.h>
- void Swap(float &x, float &y)
- {
- x = x + y;
- y = x - y;
- x = x - y;
- }
-
- void PrintData(int *pDataArray, int iDataNum)
- {
- for (int i = 0; i < iDataNum; i++)
- printf("%d ", pDataArray[i]);
- printf("
");
- fflush(stdout);
- }
-
-
- void DataSwap(int* data1, int* data2)
- {
- int temp = *data1;
- *data1 = *data2;
- *data2 = temp;
- }
-
-
-
-
-
-
-
-
-
- void ShellInsert(int* pDataArray, int d, int iDataNum)
- {
- for (int i = d; i < iDataNum; i += 1)
- {
- int j = i - d;
- int temp = pDataArray[i];
- while (j >= 0 && pDataArray[j] > temp)
- {
- pDataArray[j+d] = pDataArray[j];
- j -= d;
- }
-
- if (j != i - d)
- pDataArray[j+d] = temp;
- }
- }
-
-
-
-
-
-
-
- void ShellSort(int* pDataArray, int iDataNum)
- {
- int d = iDataNum / 2;
- while(d >= 1)
- {
- ShellInsert(pDataArray, d, iDataNum);
- d = d / 2;
- }
- }
-
-
-
-
-
-
-
- int GetNumInPos(int num,int pos)
- {
- int temp = 1;
- for (int i = 0; i < pos - 1; i++)
- temp *= 10;
-
- return (num / temp) % 10;
- }
-
-
-
-
-
-
-
- #define RADIX_10 10 //整形排序
- #define KEYNUM_31 10 //关键字个数,这里为整形位数
- void RadixSort(int* pDataArray, int iDataNum)
- {
- int *radixArrays[RADIX_10];
- for (int i = 0; i < 10; i++)
- {
- radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));
- radixArrays[i][0] = 0;
- }
-
- for (int pos = 1; pos <= KEYNUM_31; pos++)
- {
- for (int i = 0; i < iDataNum; i++)
- {
- int num = GetNumInPos(pDataArray[i], pos);
- int index = ++radixArrays[num][0];
- radixArrays[num][index] = pDataArray[i];
- }
-
- for (int i = 0, j =0; i < RADIX_10; i++)
- {
- for (int k = 1; k <= radixArrays[i][0]; k++)
- pDataArray[j++] = radixArrays[i][k];
- radixArrays[i][0] = 0;
- }
- }
- }
-
-
-
-
-
-
-
-
-
- void SlipDown(int *pDataArray,int iCurNode,int iDataNum)
- {
- int temp = pDataArray[iCurNode];
-
- for (int iNextNode = iCurNode*2; iNextNode <= iDataNum; iNextNode = iCurNode*2)
- {
- if (iNextNode + 1 <= iDataNum
- && pDataArray[iNextNode] < pDataArray[iNextNode + 1])
- iNextNode++;
- if (pDataArray[iNextNode] > temp)
- pDataArray[iCurNode] = pDataArray[iNextNode];
- else
- break;
-
- iCurNode = iNextNode;
- }
-
- pDataArray[iCurNode] = temp;
- }
-
-
-
-
-
-
-
- void HeapSort(int* pDataArray, int iDataNum)
- {
- pDataArray--;
- for (int i = iDataNum/2; i > 0; i--)
- SlipDown(pDataArray, i, iDataNum);
-
- for (int i = iDataNum; i > 1; i--)
- {
- DataSwap(&pDataArray[i], &pDataArray[1]);
- SlipDown(pDataArray, 1, i - 1);
- }
- }
-
-
-
-
-
-
-
-
-
-
- int Split(int *pDataArray,int iBegin,int iEnd)
- {
- int rIndex = rand() % (iEnd - iBegin + 1);
-
- int pData = pDataArray[iBegin + rIndex];
-
- while (iBegin < iEnd)
- {
- while (iEnd > iBegin && pDataArray[iEnd] >= pData)
- iEnd--;
-
- if (iEnd != iBegin)
- {
- pDataArray[iBegin] = pDataArray[iEnd];
- iBegin++;
-
- while (iBegin < iEnd && pDataArray[iBegin] <= pData)
- iBegin++;
-
- if (iBegin != iEnd)
- {
- pDataArray[iEnd] = pDataArray[iBegin];
- iEnd--;
- }
- }
- }
-
- pDataArray[iEnd] = pData;
- return iEnd;
- }
-
-
-
-
-
-
-
-
- void QSort(int* pDataArray, int iBegin, int iEnd)
- {
- if (iBegin < iEnd)
- {
- int pos = Split(pDataArray, iBegin, iEnd);
- QSort(pDataArray, iBegin, pos - 1);
- QSort(pDataArray, pos + 1, iEnd);
- }
- }
-
-
-
-
-
-
-
- void QuickSort(int* pDataArray, int iDataNum)
- {
- QSort(pDataArray, 0, iDataNum - 1);
- }
-
-
-
-
-
-
-
-
-
-
-
-
- void Merge(int* pDataArray, int *pTempArray, int bIndex, int mIndex, int eIndex)
- {
- int mLength = eIndex - bIndex;
- int i = 0;
- int j = bIndex;
- int k = mIndex;
-
- while (j < mIndex && k < eIndex)
- {
- if (pDataArray[j] <= pDataArray[k])
- {
- pTempArray[i++] = pDataArray[j];
- j++;
- }
- else
- {
- pTempArray[i++] = pDataArray[k];
- k++;
- }
- }
-
- if (j == mIndex)
- while (k < eIndex)
- pTempArray[i++] = pDataArray[k++];
- else
- while (j < mIndex)
- pTempArray[i++] = pDataArray[j++];
-
- for (i = 0; i < mLength; i++)
- pDataArray[bIndex + i] = pTempArray[i];
- }
-
-
-
-
-
-
-
- void BottomUpMergeSort(int* pDataArray, int iDataNum)
- {
- int *pTempArray = (int *)malloc(sizeof(int) * iDataNum);
- int length = 1;
- while (length < iDataNum)
- {
- int i = 0;
- for (; i + 2*length < iDataNum; i += 2*length)
- Merge(pDataArray, pTempArray, i, i + length, i + 2*length);
- if (i + length < iDataNum)
- Merge(pDataArray, pTempArray, i, i + length, iDataNum);
- length *= 2;
- }
- free(pTempArray);
- }
-
-
-
-
-
-
-
-
-
- void RecursionMergeSort(int* pDataArray, int *pTempArray, int iBegin, int iEnd)
- {
- if (iBegin < iEnd)
- {
- int middle = (iBegin + iEnd) / 2;
- RecursionMergeSort(pDataArray, pTempArray, iBegin, middle);
- RecursionMergeSort(pDataArray, pTempArray, middle + 1, iEnd);
- Merge(pDataArray, pTempArray, iBegin, middle + 1, iEnd + 1);
- }
- }
-
-
-
-
-
-
-
- void UpBottomMergeSort(int* pDataArray, int iDataNum)
- {
- int *pTempArray = (int *)malloc(sizeof(int) * iDataNum);
- RecursionMergeSort(pDataArray, pTempArray, 0, iDataNum - 1);
- free(pTempArray);
- }
-
-
- int FindInsertIndex(int *pDataArray, int iLen, int iData)
- {
- int iBegin = 0;
- int iEnd = iLen - 1;
- int index = -1;
- while (iBegin <= iEnd)
- {
- index = (iBegin + iEnd) / 2;
- if (pDataArray[index] > iData)
- iEnd = index - 1;
- else
- iBegin = index + 1;
- }
- if (pDataArray[index] <= iData)
- index++;
- return index;
- }
-
-
-
-
-
-
-
- void BinaryInsertSort(int* pDataArray, int iDataNum)
- {
- for (int i = 1; i < iDataNum; i++)
- {
- int index = FindInsertIndex(pDataArray, i, pDataArray[i]);
-
- if (i != index)
- {
- int j = i;
- int temp = pDataArray[i];
- while (j > index)
- {
- pDataArray[j] = pDataArray[j-1];
- j--;
- }
- pDataArray[j] = temp;
- }
- }
- }
-
-
-
-
-
-
-
- void InsertSort(int* pDataArray, int iDataNum)
- {
- for (int i = 1; i < iDataNum; i++)
- {
- int j = 0;
- while (j < i && pDataArray[j] <= pDataArray[i])
- j++;
-
- if (j < i)
- {
- int k = i;
- int temp = pDataArray[i];
- while (k > j)
- {
- pDataArray[k] = pDataArray[k-1];
- k--;
- }
- pDataArray[k] = temp;
- }
- }
- }
-
-
-
-
-
-
-
- void InsertSort1(int* pDataArray, int iDataNum)
- {
- for (int i = 1; i < iDataNum; i++)
- {
- int j = i - 1;
- int temp = pDataArray[i];
- while (j >= 0 && pDataArray[j] > temp)
- {
- pDataArray[j+1] = pDataArray[j];
- j--;
- }
-
- if (j != i - 1)
- pDataArray[j+1] = temp;
- }
- }
-
-
-
-
-
-
-
- void SelectionSort(int* pDataArray, int iDataNum)
- {
- for (int i = 0; i < iDataNum - 1; i++)
- {
- int index = i;
- for (int j = i + 1; j < iDataNum; j++)
- if (pDataArray[j] < pDataArray[index])
- index = j;
-
- if (index != i)
- DataSwap(&pDataArray[index], &pDataArray[i]);
- }
- }
-
-
-
-
-
-
-
- void BubbleSort(int* pDataArray, int iDataNum)
- {
- BOOL flag = FALSE;
- for (int i = 0; i < iDataNum - 1; i++)
- {
- flag = FALSE;
- for (int j = 0; j < iDataNum - i - 1; j++)
- if (pDataArray[j] > pDataArray[j + 1])
- {
- flag = TRUE;
- DataSwap(&pDataArray[j], &pDataArray[j + 1]);
- }
-
- if (!flag)
- break;
- }
- }
-
-
- BOOL CheckOrder(int *pDataArray, int iDataNum)
- {
- for (int i = 0; i < iDataNum - 1; i++)
- if (pDataArray[i] > pDataArray[i+1])
- return FALSE;
- return TRUE;
- }
-
- UINT64 time_fre;
-
- UINT64 GetTimeM()
- {
-
- LARGE_INTEGER curCounter;
- QueryPerformanceCounter(&curCounter);
- return curCounter.QuadPart*1000/time_fre;
- }
-
- void BubbleSortTest(int *pDataArray,int length, FILE *fp)
- {
-
- for (int i = 0; i < length; i++)
- pDataArray[i] = rand()%100000;
-
- UINT64 begin;
- UINT64 end;
- begin = GetTimeM();
- BubbleSort(pDataArray, length);
- end = GetTimeM();
-
- fprintf(fp, " %d", int(end-begin));
-
- if (!CheckOrder(pDataArray, length))
- printf("BubbleSort algorithm failed!
");
- else
- printf("BubbleSort algorithm succeed!
");
- }
-
- void SelectSortTest(int *pDataArray,int length, FILE *fp)
- {
-
- for (int i = 0; i < length; i++)
- pDataArray[i] = rand()%100000;
-
- UINT64 begin;
- UINT64 end;
- begin = GetTimeM();
- SelectionSort(pDataArray, length);
- end = GetTimeM();
-
- fprintf(fp, " %d", int(end-begin));
-
- if (!CheckOrder(pDataArray, length))
- printf("SelectSort algorithm failed!
");
- else
- printf("SelectSort algorithm succeed!
");
- }
-
- void InsertSortTest(int *pDataArray,int length, FILE *fp)
- {
-
- for (int i = 0; i < length; i++)
- pDataArray[i] = rand()%100000;
-
- UINT64 begin;
- UINT64 end;
- begin = GetTimeM();
- InsertSort(pDataArray, length);
- end = GetTimeM();
-
- fprintf(fp, " %d", int(end-begin));
-
- if (!CheckOrder(pDataArray, length))
- printf("InsertSort algorithm failed!
");
- else
- printf("InsertSort algorithm succeed!
");
- }
-
- void BottomUpMergeSortTest(int *pDataArray,int length, FILE *fp)
- {
-
- for (int i = 0; i < length; i++)
- pDataArray[i] = rand()%100000;
-
- UINT64 begin;
- UINT64 end;
- begin = GetTimeM();
- BottomUpMergeSort(pDataArray, length);
- end = GetTimeM();
-
- fprintf(fp, " %d", int(end-begin));
-
- if (!CheckOrder(pDataArray, length))
- printf("BottomUpMergeSort algorithm failed!
");
- else
- printf("BottomUpMergeSort algorithm succeed!
");
- }
-
- void UpBottomMergeSortTest(int *pDataArray,int length, FILE *fp)
- {
-
- for (int i = 0; i < length; i++)
- pDataArray[i] = rand()%100000;
-
- UINT64 begin;
- UINT64 end;
- begin = GetTimeM();
- UpBottomMergeSort(pDataArray, length);
- end = GetTimeM();
-
- fprintf(fp, " %d", int(end-begin));
-
- if (!CheckOrder(pDataArray, length))
- printf("UpBottomMergeSort algorithm failed!
");
- else
- printf("UpBottomMergeSort algorithm succeed!
");
- }
-
- void QuickSortTest(int *pDataArray,int length, FILE *fp)
- {
-
- for (int i = 0; i < length; i++)
- pDataArray[i] = rand()%100000;
-
- UINT64 begin;
- UINT64 end;
- begin = GetTimeM();
- QuickSort(pDataArray, length);
- end = GetTimeM();
-
- fprintf(fp, " %d", int(end-begin));
-
- if (!CheckOrder(pDataArray, length))
- printf("QuickSort algorithm failed!
");
- else
- printf("QuickSort algorithm succeed!
");
- }
-
- void HeapSortTest(int *pDataArray,int length, FILE *fp)
- {
-
- for (int i = 0; i < length; i++)
- pDataArray[i] = rand()%100000;
-
- UINT64 begin;
- UINT64 end;
- begin = GetTimeM();
- HeapSort(pDataArray, length);
- end = GetTimeM();
-
- fprintf(fp, " %d", int(end-begin));
-
- if (!CheckOrder(pDataArray, length))
- printf("HeapSort algorithm failed!
");
- else
- printf("HeapSort algorithm succeed!
");
- }
-
- void RadixSortTest(int *pDataArray,int length, FILE *fp)
- {
-
- for (int i = 0; i < length; i++)
- pDataArray[i] = rand()%100000;
-
- UINT64 begin;
- UINT64 end;
- begin = GetTimeM();
- RadixSort(pDataArray, length);
- end = GetTimeM();
-
- fprintf(fp, " %d", int(end-begin));
-
- if (!CheckOrder(pDataArray, length))
- printf("RadixSort algorithm failed!
");
- else
- printf("RadixSort algorithm succeed!
");
- }
-
- void ShellSortTest(int *pDataArray,int length, FILE *fp)
- {
-
- for (int i = 0; i < length; i++)
- pDataArray[i] = rand()%100000;
-
- UINT64 begin;
- UINT64 end;
- begin = GetTimeM();
- ShellSort(pDataArray, length);
- end = GetTimeM();
-
- fprintf(fp, " %d", int(end-begin));
-
- if (!CheckOrder(pDataArray, length))
- printf("ShellSort algorithm failed!
");
- else
- printf("ShellSort algorithm succeed!
");
- }
-
- int main()
- {
- #define ARRAYLENGTH 10000 //无序数组初始长度
- #define ADDLENGTH 10000 //无序数组增幅
- #define MAXLENGTH 100000 //最大无序数组长度
-
- int length;
- srand(time(NULL));
-
- LARGE_INTEGER litmp;
- QueryPerformanceFrequency(&litmp);
- time_fre = (UINT64 )litmp.QuadPart;
-
- int *pDataArray = new int[MAXLENGTH];
- FILE *fp = fopen("data.txt", "w");
-
-
- length = ARRAYLENGTH;
- for (; length <= MAXLENGTH; length += ADDLENGTH)
- {
- BubbleSortTest(pDataArray, length, fp);
- }
- fprintf(fp, "
");
-
- length = ARRAYLENGTH;
- for (; length <= MAXLENGTH; length += ADDLENGTH)
- {
- SelectSortTest(pDataArray, length, fp);
- }
- fprintf(fp, "
");
-
- length = ARRAYLENGTH;
- for (; length <= MAXLENGTH; length += ADDLENGTH)
- {
- InsertSortTest(pDataArray, length, fp);
- }
- fprintf(fp, "
");
-
- length = ARRAYLENGTH;
- for (; length <= MAXLENGTH; length += ADDLENGTH)
- {
- BottomUpMergeSortTest(pDataArray, length, fp);
- }
- fprintf(fp, "
");
-
- length = ARRAYLENGTH;
- for (; length <= MAXLENGTH; length += ADDLENGTH)
- {
- UpBottomMergeSortTest(pDataArray, length, fp);
- }
- fprintf(fp, "
");
-
- length = ARRAYLENGTH;
- for (; length <= MAXLENGTH; length += ADDLENGTH)
- {
- QuickSortTest(pDataArray, length, fp);
- }
- fprintf(fp, "
");
-
- length = ARRAYLENGTH;
- for (; length <= MAXLENGTH; length += ADDLENGTH)
- {
- HeapSortTest(pDataArray, length, fp);
- }
- fprintf(fp, "
");
-
- length = ARRAYLENGTH;
- for (; length <= MAXLENGTH; length += ADDLENGTH)
- {
- RadixSortTest(pDataArray, length, fp);
- }
- fprintf(fp, "
");
-
- length = ARRAYLENGTH;
- for (; length <= MAXLENGTH; length += ADDLENGTH)
- {
- ShellSortTest(pDataArray, length, fp);
- }
- fprintf(fp, "
");
-
- fclose(fp);
- free(pDataArray);
- return 0;
- }
-
相关阅读:
一键清理 Nexus 中无用的 Docker 镜像
python 获取Linux和Windows硬件信息
基于Docker安装破解版Jira(无坑)
vim安装vundle时遇到的问题
SpringBoot注解大全
SpringBoot 应用JPA中的一些知识点
记录初学SpringBoot使用Redis序列化的坑
Spring Boot连接MySql报错
钉钉扫码登录中的签名算法在python中的实现
让Linux的history命令显示用户名和时间
-
原文地址:https://www.cnblogs.com/jeanschen/p/3538827.html
Copyright © 2020-2023
润新知