/* 求优化建议 */ /* 哪里不足尽管指出 */ #include <cstdlib> #include <iostream> #include <vector> #include <stdlib.h> #include <time.h> using namespace std; vector<unsigned long int> a(0); //Index sort vector<unsigned long int> b(0); //Save Index unsigned long int StartIndex = 0; //The max value's absolute distance in array in accordance with 0 unsigned long int N; //The counts of array's elements unsigned long int MaxValueCounts; //The counts of filter max value will be short int Compare(const unsigned long int &middle); void Insert(const unsigned long int &index); unsigned long int ConvertIndex(const long int index); //Calculate the absolute distance in accordance with StartIndex //fast declare unsigned long int d; //Save the value of a[i] unsigned long int CurFilterUpper; //The upper of array's filter max value unsigned long int i; //end fast declare int main(int argc, char *argv[]) { double t1,t2,duration; bool ifdo = true; unsigned long int LeftIndex,RightIndex,Middle; cout << "Please input the total of enter data value: "; cin >> N; cout << "Please input the counts of filter max value: " ; cin >> MaxValueCounts; a.resize(N + 1); b.resize(MaxValueCounts + 2); srand(time(NULL)); for (i = 1; i <= N; i++) { a[i] = rand(); } t1 = clock(); //-------------Sort data value from max to min-------------// a[0] = 0-1; b[0] = 0; b[1] = 1; for (i = 2; i <= N; ++i) { d = a[i]; LeftIndex = 1; RightIndex = CurFilterUpper = i - 1; //Save the upper of array's filter max value if (CurFilterUpper > MaxValueCounts) { RightIndex = CurFilterUpper = MaxValueCounts; } ifdo = true; do { Middle = (LeftIndex + RightIndex) / 2; switch( Compare(a[ b[ConvertIndex(Middle)] ]) ) { case 1: if (LeftIndex >= RightIndex) { Insert(Middle + 1); ifdo = false; break; } LeftIndex = Middle + 1; break; case -1: if (LeftIndex >= RightIndex) { Insert(Middle); ifdo = false; break; } RightIndex = Middle; break; case 0: Insert(Middle + 1); ifdo = false; break; }; } while (ifdo); } //------------------------Finished sort------------------------// t2 = clock(); duration = t2 - t1; cout << "Use time: " << duration << endl; system("PAUSE"); for (i = 1; i <= MaxValueCounts; i++) cout << a[ b[ConvertIndex(i)] ] << endl; system("PAUSE"); return EXIT_SUCCESS; } short int Compare(const unsigned long int &middle) { if (middle < d) return -1; if (middle > d) return 1; return 0; } void Insert(const unsigned long int &index) { long int k; unsigned long int middle = CurFilterUpper / 2; if (middle < index) { for (k = CurFilterUpper; k >= index; --k) b[ConvertIndex(k + 1)] = b[ConvertIndex(k)]; b[ConvertIndex(index)] = i; } else { b[ConvertIndex(CurFilterUpper + 1)] = b[ConvertIndex(- 1)]; for (k = 0; k <= index - 1; ++k) b[ConvertIndex(k - 1)] = b[ConvertIndex(k)]; b[ConvertIndex(index - 1)] = i; StartIndex = ConvertIndex(- 1); } return; } unsigned long int ConvertIndex(const long int index) { return (StartIndex + index + (MaxValueCounts + 1)) % (MaxValueCounts + 1); //Absolute distance base on 0 /* 应该就是上面这句,频繁调用忒别慢... */ } 原地版本 #include <cstdlib> #include <iostream> #include <vector> #include <stdlib.h> #include <time.h> using namespace std; vector<unsigned long int> a(0); //Local sort unsigned long int StartIndex = 0; //The max value's absolute distance in array in accordance with 0 unsigned long int N; //The counts of array's elements unsigned long int MaxValueCounts; //The counts of filter max value will be short int Compare(const unsigned long int &middle); void Insert(const unsigned long int &index); unsigned long int ConvertIndex(const long int index); //Calculate the absolute distance in accordance with StartIndex //fast declare unsigned long int d; //Save the value of a[i] unsigned long int CurFilterUpper; //The upper of array's filter max value unsigned long int i; //end fast declare int main(int argc, char *argv[]) { double t1,t2,duration; bool ifdo = true; unsigned long int LeftIndex,RightIndex,Middle; cout << "Please input the total of enter data value: "; cin >> N; cout << "Please input the counts of filter max value: " ; cin >> MaxValueCounts; a.resize(N + 2); srand(time(NULL)); for (i = 1; i <= N; i++) { a[i] = rand(); } t1 = clock(); //-------------Sort data value from max to min-------------// a[0] = 0-1; for (i = 2; i <= N; ++i) { d = a[ConvertIndex(i)]; //Save a[CurIndex] LeftIndex = 1; RightIndex = CurFilterUpper = i - 1; //Save the upper of array's filter max value if (CurFilterUpper > MaxValueCounts) { RightIndex = CurFilterUpper = MaxValueCounts; } ifdo = true; do { Middle = (LeftIndex + RightIndex) / 2; switch( Compare(a[ConvertIndex(Middle)]) ) { case 0: Insert(Middle + 1); ifdo = false; break; case 1: if (LeftIndex >= RightIndex) { Insert(Middle + 1); ifdo = false; break; } LeftIndex = Middle + 1; break; case -1: if (LeftIndex >= RightIndex) { Insert(Middle); ifdo = false; break; } RightIndex = Middle; break; }; } while (ifdo); } //------------------------Finished sort------------------------// t2 = clock(); duration = t2 - t1; cout << "Use time: " << duration << endl; system("PAUSE"); for (i = 1; i <= MaxValueCounts; i++) cout << a[ConvertIndex(i)] << endl; system("PAUSE"); return EXIT_SUCCESS; } short int Compare(const unsigned long int &middle) { if (middle == d) return 0; if (middle > d) return 1; return -1; } void Insert(const unsigned long int &index) { long int k; unsigned long int middle = CurFilterUpper / 2; if (middle < index) { for (k = CurFilterUpper; k >= index; --k) a[ConvertIndex(k + 1)] = a[ConvertIndex(k)]; a[ConvertIndex(index)] = d; } else { a[ConvertIndex(i)] = a[ConvertIndex(- 1)]; for (k = 0; k <= index - 1; ++k) a[ConvertIndex(k - 1)] = a[ConvertIndex(k)]; a[ConvertIndex(index - 1)] = d; StartIndex = ConvertIndex(- 1); } return; } unsigned long int ConvertIndex(const long int index) { unsigned long int distance; distance = (StartIndex + index + (N + 1)) % (N + 1); //Absolute distance base on 0 return distance; } 链表排序 #include <cstdlib> #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; struct LongNode { unsigned long int Value; struct LongNode *prev; struct LongNode *next; }; struct LongNodeChain { unsigned int NodeCounts; // = N + 1 struct LongNode *head; // The value of LongChain.head is max }; struct LongNodeChain LongChain; unsigned long int N; // The max index (0 to N) unsigned long int MaxValueCounts; void LongChainSort(); short int Compare(const struct LongNode *middle); void MoveNode(const unsigned long int index); struct LongNode * FindNode(const long int index); void InputDataValue(); void AddNode(); void Display(); //fast declare struct LongNode *p; unsigned long int CurFilterUpper; unsigned long int i; //end fast declare int main() { LongChain.NodeCounts = 0; LongChain.head = NULL; double t1,t2,duration; cout << "Please input the total of enter data value: "; cin >> N; cout << "Please input the counts of filter max value: " ; cin >> MaxValueCounts; cout << endl; srand(time(NULL)); InputDataValue(); //-------------Sort data value from max to min-------------// LongChainSort(); //----------------------Finished sort----------------------// t2 = clock(); duration = t2 - t1; cout << "Use time: " << duration << endl; Display(); system("PAUSE"); return EXIT_SUCCESS; } void InputDataValue() { for (i = 0; i <= N; ++i) { p = new LongNode; p->prev = p->next = NULL; p->Value = rand(); AddNode(); } return; } void AddNode() { if (LongChain.head==NULL) { p->Value = 0 - 1; LongChain.head = p; LongChain.head->prev = p; LongChain.head->next = p; } else { MoveNode(1); } ++LongChain.NodeCounts; return; } void LongChainSort() { bool ifdo = true; unsigned long int LeftIndex,RightIndex,Middle; for (i = 2; i <= N; ++i) { p = FindNode(i); LeftIndex = 1; RightIndex = CurFilterUpper = i - 1; if (CurFilterUpper > MaxValueCounts) { RightIndex = CurFilterUpper = MaxValueCounts; } ifdo = true; do { Middle = (LeftIndex + RightIndex) / 2; switch( Compare(FindNode(Middle)) ) { case 1: if (LeftIndex >= RightIndex) { MoveNode(Middle + 1); ifdo = false; break; } LeftIndex = Middle + 1; break; case -1: if (LeftIndex >= RightIndex) { MoveNode(Middle); ifdo = false; break; } RightIndex = Middle; break; case 0: MoveNode(Middle + 1); ifdo = false; break; }; } while (ifdo); } return; } void Display() { system("PAUSE"); p = LongChain.head->next; for (i = 1; i <= MaxValueCounts; ++i) { cout << p->Value << endl; p = p->next; }; return; } short int Compare(const struct LongNode *middle) { if (middle->Value < p->Value) return -1; if (middle->Value > p->Value) return 1; return 0; } void MoveNode(const unsigned long int index) { if (p->prev != NULL) p->prev->next = p->next; if (p->next != NULL) p->next->prev = p->prev; struct LongNode *node1 = FindNode(index - 1); struct LongNode *node2 = FindNode(index); node1->next = p; p->prev = node1; node2->prev = p; p->next = node2; return; } struct LongNode * FindNode(const long int index) { unsigned long int ConvertIndex = index; //(index + LongChain.NodeCounts) % LongChain.NodeCounts; struct LongNode * node = LongChain.head; unsigned long int middle = N / 2; unsigned long int k; if (middle < ConvertIndex) { for (k = 1; k <= LongChain.NodeCounts - ConvertIndex; ++k) node = node->prev; } else { for (k = 1; k <= ConvertIndex; ++k) node = node->next; } return node; } 这个非常快! #include <cstdlib> #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; struct salaryInfo { char name[10]; int salary; salaryInfo *next_node; }; struct salaryInfo_chain { unsigned int node_counts; salaryInfo *head; salaryInfo *pEnd; salaryInfo *pS; }; salaryInfo_chain salarySort; void inputInfo(); void node_add(salaryInfo *node); void display(); void salary_sort(int start_pos,int end_pos); int partition(int start_pos,int end_pos); void node_swap(int node1_pos,int node2_pos); void move_node(int src_pos,int dest_pos); salaryInfo * find_node(int n); int main(int argc, char *argv[]) { salarySort.node_counts = 0; salarySort.pS = salarySort.pEnd = salarySort.head = NULL; srand(time(NULL)); inputInfo(); display(); cout << endl; salary_sort(1,salarySort.node_counts); display(); system("PAUSE"); return EXIT_SUCCESS; } void inputInfo() { cout << "录入几条记录?:"; unsigned int record_counts; cin >> record_counts; for (int i = 0; i < record_counts; i++) { salaryInfo *info_ptr = new salaryInfo; node_add(info_ptr); info_ptr->name[9] = '/0'; info_ptr->salary = 1000 + rand()%2000; //for (int j = 0;j < 9; j++) // info_ptr->name[j] = 'a' + rand()%26; //cout << "员工姓名:" << info_ptr->name << " "; //cout << "员工薪水:" << info_ptr->salary << endl; }; return; } void node_add(salaryInfo *node) { if (salarySort.head==NULL) { salarySort.pS = salarySort.pEnd = salarySort.head=node; } else { salarySort.pEnd->next_node = node; salarySort.pEnd = node; salarySort.pEnd->next_node = NULL; } salarySort.node_counts++; return; } void salary_sort(int start_pos,int end_pos) { if (start_pos >= end_pos) return; int pivot_pos = partition(start_pos,end_pos); salary_sort(start_pos,pivot_pos - 1); salary_sort(pivot_pos + 1,end_pos); return; } int partition(int start_pos,int end_pos) { int pivot_pos = start_pos; salaryInfo *pivot_node = find_node(end_pos); for (int cur_pos = start_pos; cur_pos < end_pos; cur_pos++) { if (find_node(cur_pos)->salary > pivot_node->salary) { node_swap(cur_pos,pivot_pos); pivot_pos++; } } node_swap(pivot_pos,end_pos); return pivot_pos; } void node_swap(int node1_pos,int node2_pos) { if (node1_pos == node2_pos) return; move_node(node1_pos,node2_pos); node2_pos = (node1_pos > node2_pos ? ++node2_pos : --node2_pos); move_node(node2_pos,node1_pos); return; } salaryInfo * find_node(int n) { if (n<=0||n>salarySort.node_counts) return NULL; salaryInfo * node = salarySort.head; for (int i = 1; i < n; i++) { node = node->next_node; } return node; } void move_node(int src_pos,int dest_pos) { if (src_pos == dest_pos) return; salaryInfo *src_node = find_node(src_pos); if (src_node == NULL) return; salaryInfo *dest_node = find_node(dest_pos - (src_pos > dest_pos)); if (src_node != salarySort.head) { find_node(src_pos - 1)->next_node = src_node->next_node; } else { salarySort.head = src_node->next_node; } if (dest_node != NULL) { src_node->next_node = dest_node->next_node; dest_node->next_node = src_node; } else { src_node->next_node = salarySort.head; salarySort.head = src_node; } return; } void display() { salarySort.pS = salarySort.head; while (salarySort.pS != NULL) { cout << salarySort.pS->name << ' ' << salarySort.pS->salary << endl; salarySort.pS = salarySort.pS->next_node; }; return; }